간단한 개발 및 배포를 위해 Django를 어떻게 구성합니까?


112

나는 Django 개발을 할 때 SQLite 를 사용하는 경향이 있지만 라이브 서버에서는 종종 더 강력한 것이 필요합니다 ( 예 : MySQL / PostgreSQL ). 변함없이 Django 설정에도 다른 변경 사항이 있습니다 : 다른 로깅 위치 / 강도, 미디어 경로 등.

배포를 간단하고 자동화 된 프로세스로 만들기 위해 이러한 모든 변경 사항을 어떻게 관리합니까?


나는 분명히 다른 사람만큼 멋진 것을하지 않습니다 :). 나는 장고가 제공하는 ORM을 이용합니다.
Andrew Sledge

1
문제는 :-) 환경 사이에서 스위치 설정의 변화를 자동화하는 방법이었다
Guruprasad 사용자


이 패키지를 볼 수 있습니다 : django-split-settings
sobolevn

답변:


86

업데이트 : django-configurations 가 출시되었습니다. 이것은 아마도 수동으로하는 것보다 대부분의 사람들에게 더 나은 옵션 일 것입니다.

수동으로 작업하려는 경우 이전 답변이 여전히 적용됩니다.

여러 설정 파일이 있습니다.

  • settings_local.py -데이터베이스 이름, 파일 경로 등과 같은 호스트 별 구성
  • settings_development.py-개발에 사용되는 구성 (예 : DEBUG = True.
  • settings_production.py-생산에 사용되는 구성 (예 : SERVER_EMAIL.

이 모든 settings.py것을 먼저 가져 오는 파일 settings_local.py과 연결 한 다음 나머지 두 개 중 하나를 연결합니다. 그것은 내부의 두 설정에 의해로드 할 결정 settings_local.py- DEVELOPMENT_HOSTSPRODUCTION_HOSTS. 실행중인 시스템의 호스트 이름을 찾기 위해 settings.py호출 platform.node()한 다음 목록에서 해당 호스트 이름을 찾고 호스트 이름을 찾은 목록에 따라 두 번째 설정 파일을로드합니다.

이렇게 settings_local.py하면 호스트 별 구성을 사용 하여 파일을 최신 상태로 유지하고 나머지는 모두 자동으로 처리해야합니다.

여기 에서 예를 확인 하십시오 .


2
스테이징 (개발)과 프로덕션이 동일한 시스템에 있으면 어떻게됩니까? platform.node ()는 동일한 결과를 반환합니다.
gwaramadze 2013

2
예제 링크가 다운되었습니다.
Jickson

호스트 목록을 기반으로 설정을 결정하는 좋은 아이디어! 내 한 가지 핵심은 명명법 (settings_local.py는 항상 먼저 가져 오기 때문에 재정의되지 않은 설정은 실제로 프로덕션에서 활성화되어 접미사를 _local다소 혼란스럽게 만듭니다 )과 모듈을 사용하지 않는다는 사실 (설정 /base.py, settings / local.py, settings / production.py). 이 정보를 별도의 저장소에 보관하는 것도 현명 할 것입니다. 더 좋은 방법은 표준 소스에서이 정보를 제공하는 보안 서비스입니다 (대부분의 경우 과도 할 수 있음) ... 새 호스트에 새 릴리스가 필요하지 않습니다.
DylanYoung dec.

더 좋은 점은 컴퓨터 관리 소프트웨어를 사용하는 경우 .py파일 의 호스트 목록을 확인하여 모든 호스트가 다른 모든 호스트의 구성에 대한 정보에 액세스 할 수 있도록하는 대신 적절한 설정을 사용하도록 manage.py를 템플릿 할 수 있습니다. 배포 구성의 파일.
DylanYoung dec

26

개인적으로 저는 프로젝트에 대해 하나의 settings.py를 사용합니다. 저는 단지 그것이있는 호스트 이름을 찾도록합니다 (제 개발 머신은 "gabriel"로 시작하는 호스트 이름을 가지고 있습니다. 그래서 저는 이것을 가지고 있습니다 :

import socket
if socket.gethostname().startswith('gabriel'):
    LIVEHOST = False
else: 
    LIVEHOST = True

다른 부분에는 다음과 같은 것이 있습니다.

if LIVEHOST:
    DEBUG = False
    PREPEND_WWW = True
    MEDIA_URL = 'http://static1.grsites.com/'
else:
    DEBUG = True
    PREPEND_WWW = False
    MEDIA_URL = 'http://localhost:8000/static/'

등등. 가독성이 조금 떨어지지 만 잘 작동하며 여러 설정 파일을 저글링해야하는 시간을 절약합니다.


이 아이디어가 마음에 들지만 동일한 호스트에서 실행되는 다른 Django 인스턴스를 구별 할 수는 없습니다. 예를 들어 동일한 호스트의 서로 다른 하위 도메인에 대해 서로 다른 인스턴스를 실행 한 경우 이러한 상황이 발생합니다.
Erik

24

settings.py의 끝에 다음이 있습니다.

try:
    from settings_local import *
except ImportError:
    pass

이렇게하면 기본 설정을 재정의하려면 settings.py 바로 옆에 settings_local.py를 배치하면됩니다.


4
에 오타 경우 때문에 약간 위험 settings_local의 결과 ImportError,이 except자동으로 삼킬 것입니다.
Chris Martin

메시지 No module named...대을 확인할 수는 cannot import name...있지만 깨지기 쉽습니다. 또는 try 블록의 settings_local.py에 가져 오기를 넣고 더 구체적인 예외 MisconfiguredSettings를 발생시킵니다.
DylanYoung dec

11

두 개의 파일이 있습니다. settings_base.py공통 / 기본 설정을 포함하고 소스 제어에 체크인됩니다. 각 배포에는 처음에 settings.py실행 된 from settings_base import *다음 필요에 따라 재정의 하는 별도 의이 있습니다.


1
나도 이것을 사용합니다. 필요한 경우 로컬 설정이 전역 설정에 액세스하고 수정할 수 있도록 허용하기 때문에 역 (settings.py 끝에있는 dmishe의 "from settings_local import *")보다 우수합니다.
Carl Meyer

3
경우 settings_local.py이 작업을 수행 from settings import *,이 값을 재정의 할 수 있습니다 settings.py. ( settings_local.py파일은 끝에 가져와야합니다 settings.py).
세스

어쨌든 할 수 있습니다. 위의 stackoverflow.com/a/7047633/3124256을 살펴보십시오 . @Seth 순환 가져 오기를위한 레시피입니다.
DylanYoung dec

7

내가 찾은 가장 단순한 방법은 다음과 같습니다.

1) 로컬 개발을 위해 기본 settings.py 를 사용 하고 2) 다음으로 시작 하는 production-settings.py를 만듭니다 .

import os
from settings import *

그런 다음 프로덕션에서 다른 설정을 재정의하십시오.

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}

django는 프로덕션 설정을로드하는 방법을 어떻게 압니까?
AlxVallejo

2

여러 데이터베이스에 Django 자체를 배포하는 문제와 관련하여 Djangostack살펴볼 수 있습니다. Apache, Python, Django 등을 설치할 수있는 완전 무료 설치 프로그램을 다운로드 할 수 있습니다. 설치 과정의 일부로 사용할 데이터베이스 (MySQL, SQLite, PostgreSQL)를 선택할 수 있습니다. 내부적으로 배포를 자동화 할 때 설치 프로그램을 광범위하게 사용합니다 (무인 모드에서 실행할 수 있음).


1
또는 Django Turnkey Linux 를 추천하고 싶습니다. django가 사전 설치된 Ubuntu * NIX 스택을 기반으로하는 .
jochem 2011-08-02

1

내 settings.py 파일이 외부 디렉터리에 있습니다. 이렇게하면 소스 제어에 체크인되거나 배포시 덮어 쓰여지지 않습니다. 기본 설정과 함께 내 Django 프로젝트의 settings.py 파일에 넣습니다.

import sys
import os.path

def _load_settings(path):    
    print "Loading configuration from %s" % (path)
    if os.path.exists(path):
    settings = {}
    # execfile can't modify globals directly, so we will load them manually
    execfile(path, globals(), settings)
    for setting in settings:
        globals()[setting] = settings[setting]

_load_settings("/usr/local/conf/local_settings.py")

참고 : local_settings.py를 신뢰할 수없는 경우 매우 위험합니다.


1

짐에 의해 언급 된 여러 설정 파일뿐만 아니라, 나 또한 장소에 상단에 내 settings.py 파일에 두 가지 설정 경향 BASE_DIRBASE_URL코드와 사이트의베이스에 URL의 경로로 설정을, 다른 모든 설정을 수정 이것에 자신을 추가합니다.

BASE_DIR = "/home/sean/myapp/" 예 : MEDIA_ROOT = "%smedia/" % BASEDIR

따라서 프로젝트를 이동할 때 전체 파일을 검색하지 않고 이러한 설정 만 편집하면됩니다.

원격 배포의 자동화를 용이하게하는 패브릭 및 Capistrano (Ruby 도구이지만 Django 애플리케이션 배포에 사용할 수 있음) 도 살펴 보는 것이 좋습니다 .


Ansible은 Python이며 Fabric보다 훨씬 더 강력한 프로비저닝 기능을 제공합니다. 그들은 잘 짝을 이룹니다.
DylanYoung dec.

1

이 구성을 사용합니다.

settings.py 끝에서 :

#settings.py
try:
    from locale_settings import *
except ImportError:
    pass

그리고 locale_settings.py에서 :

#locale_settings.py
class Settings(object):

    def __init__(self):
        import settings
        self.settings = settings

    def __getattr__(self, name):
        return getattr(self.settings, name)

settings = Settings()

INSTALLED_APPS = settings.INSTALLED_APPS + (
    'gunicorn',)

# Delete duplicate settings maybe not needed, but I prefer to do it.
del settings
del Settings

1

너무 많은 복잡한 답변!

모든 settings.py 파일은 다음과 함께 제공됩니다.

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

이 디렉토리를 사용하여 DEBUG 변수를 다음과 같이 설정합니다 (개발 코드가있는 디렉토리로 대체).

DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
    DEBUG = True

그런 다음 settings.py 파일을 이동할 때마다 DEBUG가 False가되고 프로덕션 환경이됩니다.

개발 환경의 설정과 다른 설정이 필요할 때마다 다음을 사용하십시오.

if(DEBUG):
    #Debug setting
else:
    #Release setting

0

SQLite 사용에서 한 단계 올라갈 필요가 있는지 여부는 사이트의 크기에 따라 다르며 여러 소규모 라이브 사이트에서 SQLite를 성공적으로 사용했으며 훌륭하게 실행됩니다.


0

나는 환경을 사용합니다 :

if os.environ.get('WEB_MODE', None) == 'production' :
   from settings_production import *
else :
   from settings_dev import *

결국 테스트 환경에 대한 특수 설정이 필요하고이 조건에 쉽게 추가 할 수 있기 때문에 이것이 훨씬 더 나은 접근 방식이라고 생각합니다.


0

이것은 오래된 게시물이지만 유용하게 추가하면 library일이 단순화 될 것이라고 생각합니다 .

사용 장고 구성을

빠른 시작

pip install django-configurations

그런 다음 프로젝트의 settings.py 또는 설정 상수를 저장하는 데 사용하는 다른 모듈에 포함 된 configuration.Configuration 클래스를 하위 클래스로 지정합니다. 예 :

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

DJANGO_CONFIGURATION환경 변수를 방금 만든 클래스의 이름으로 설정합니다 . 예 ~/.bashrc:

export DJANGO_CONFIGURATION=Dev

그리고 DJANGO_SETTINGS_MODULE평소와 같이 모듈 가져 오기 경로에 대한 환경 변수 (예 : bash) :

export DJANGO_SETTINGS_MODULE=mysite.settings

또는--configuration Django의 기본 --settings명령 줄 옵션을 따라 Django 관리 명령을 사용할 때 옵션을 제공합니다 . 예 :

python manage.py runserver --settings=mysite.settings --configuration=Dev

Django가 구성을 사용할 수 있도록하려면 이제 manage.py 또는 wsgi.py 스크립트 를 수정하여 적절한 시작 기능의 django-configurations 버전을 사용해야합니다. 예를 들어 django-configurations를 사용 하는 일반적인 manage.py 는 다음과 같습니다.

#!/usr/bin/env python

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
    os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

    from configurations.management import execute_from_command_line

    execute_from_command_line(sys.argv)

10 행에서 우리는 공통 도구를 사용하지 않고 django.core.management.execute_from_command_line대신 configurations.management.execute_from_command_line.

wsgi.py 파일 에도 동일하게 적용됩니다 . 예 :

import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

from configurations.wsgi import get_wsgi_application

application = get_wsgi_application()

여기서는 기본 django.core.wsgi.get_wsgi_application함수를 사용하지 않고 대신 configurations.wsgi.get_wsgi_application.

그게 다야! 이제 manage.py 및 선호하는 WSGI 지원 서버에서 프로젝트를 사용할 수 있습니다 .


-2

실제로 개발 및 프로덕션 환경에 대해 동일한 (또는 거의 동일한) 구성을 갖는 것을 고려해야합니다. 그렇지 않으면 "내 컴퓨터에서 작동합니다"와 같은 상황이 때때로 발생합니다.

따라서 배포를 자동화하고 WOMM 문제를 제거하려면 Docker를 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.