DJANGO_SETTINGS_MODULE
을 이용한다.
장고를 사용할 때는 장고에게 어떤 세팅을 이용할 것인지를 알려줘야 한다. 따라서, 환경 변수 DJANGO_SETTINGS_MODULE
을 설정해 주어야 한다.
이 때, DJANGO_SETTINGS_MODULE
는 파이썬 path syntax로 작성되어야 한다.
(예시: DJANGO_SETTINGS_MODULE=MySite.settings.project.api.local_api, DJANGO_SETTINGS_MODULE=MySite.settings.project.api.prod_api)
django-admin utility를 이용할 때는 환경 변수를 한 번 지정하거나 서버를 실행할 때마다 명시적으로 settings module을 넘겨주는 방법을 이용할 수 있다.
export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
서버를 실행할 때마다 명시적으로 환경 변수 넘겨주기
django-admin runserver --settings=mysite.settings
DJANGO_SETTINGS_MODULE=MySite.settings.project.api.local_api
와 같이 환경 변수를 저장해 놓으면 된다.장고 설정 파일에는 적절한 기본 값이 정의되어 있기 때문에 필요하지 않은 경우 따로 설정을 정의할 필요가 없다.
해당 기본값들은 django/conf/global_settings.py
모듈에 정의되어 있다.
장고가 settings를 컴파일(프로그래머가 작성한 소스코드를 바이너리 파일로 변환하는 과정)하는 알고리즘은 다음과 같다.
global_settings.py
를 로드한다.django/conf/settings.py
)에 정의된 settings를 로드한다. 이 때 settings 파일은 필요한 경우 global settings를 오버라이딩 할 수도 있다.이 때, settings file은 global_settings.py
에 정의된 모든 설정들을 불러올 필요는 없다. 왜냐하면 여기에는 너무 많은 양의 세팅 값들이 정의되어 있기 때문이다.
만약 기본 설정값과 내가 정의한 설정값에 어떤 차이가 있는 지를 확인하고 싶다면 python manage.py diffsettings
를 명령어를 실행하면 된다.
장고 앱에서 settings를 import 하기 위해서는 아래와 같이 사용하면 된다.
from django.conf import settings
if settings.DEBUG:
# Do something
주의해야 할 점은, django.conf.settings
는 모듈이 아닌 객체라는 점이다. 그렇기 때문에 settings 안에 정의된 개별 setting을 import 하는 것은 불가능하며 해당 객체를 불러와 사용해야 한다.
django.conf.settings
는 기본 설정 및 site별 설정의 개념을 추상화 하며 단일 interface를 제공한다. 또한 설정을 사용하는 코드를 설정 위치에서 분리한다.
만약 settings를 변경하고 싶다면 settings 파일에서 수정해야 하며 import 한 settings 객체를 수정하는 방식을 사용하면 안된다.
from django.conf import settings
settings.DEBUG = True # Don't do this!
interface란?
기계, 컴퓨터 프로그램 등 사이에서 의사소통을 할 수 있도록 일시적 또는 영구적인 접근을 목적으로 만들어진 물리적, 가상적 매개체를 뜻한다. 사용자 인터페이스는 사람들이 컴퓨터와 상호 작용하는 시스템이다. 위에서 말한 interface는 아마도 장고앱과 장고 세팅 사이의 상호작용 시스템을 의미하는 것 같다.
BASE_DIR
manage.py
파일이 들어 있는 폴더를 루트 디렉토리로 지정한다. BASE_DIR = os.path.dirname(
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
)
os.path.abspath(__file__)
는 현재 파일의 절대 경로를 획득한다.os.path.dirname
은 base.py
파일이 들어 있는 폴더 이름을 찾는다.ROOT_URLCONF
ROOT_URLCONF = 'Myproject.urls'
TEMPLATES
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
},
]
BACKEND
mypackage.whatever.Backend
와 같이 커스텀 해도 된다.NAME
DIRS
'DIRS': [ os.path.join(BASE_DIR, 'templates') ],
로 지정해 놓으면 BASE_DIR/templates가 경로에 추가 되어야만 base.html 템플릿을 찾을 수 있게 된다.APP_DIRS
OPTIONS
여기를 참고했다(django docs에서 참고용으로 제안한 사이트이다).
파이썬에서는 모듈을 임포트 할 때 여러 위치를 먼저 찾아 본다. 즉, 파이썬은 sys.path.
에 정의된 모든 디렉토리들을 찾아보는데 이 디렉토리는 리스트이며 파이썬에서 일반적으로 사용하는 리스트와 같이 원소를 추가하는 것 또한 가능하다.
>>> import sys ①
>>> sys.path ②
['',
'/usr/lib/python31.zip',
'/usr/lib/python3.1',
'/usr/lib/python3.1/plat-linux2@EXTRAMACHDEPPATH@',
'/usr/lib/python3.1/lib-dynload',
'/usr/lib/python3.1/dist-packages',
'/usr/local/lib/python3.1/dist-packages']
>>> sys ③
<module 'sys' (built-in)>
>>> sys.path.insert(0, '/home/mark/diveintopython3/examples') ④
>>> sys.path ⑤
['/home/mark/diveintopython3/examples',
'',
'/usr/lib/python31.zip',
'/usr/lib/python3.1',
'/usr/lib/python3.1/plat-linux2@EXTRAMACHDEPPATH@',
'/usr/lib/python3.1/lib-dynload',
'/usr/lib/python3.1/dist-packages',
'/usr/local/lib/python3.1/dist-packages']
sys.path
는 현재 검색 경로를 구성하는 디렉터리 이름 목록이다..py
파일들 중 import 하려는 모듈명과 일치하는 것을 찾아볼 것이다.sys.path
에 있는 모든 모듈이 .py
파일인 것은 아니다. 왜냐하면, built-in 모듈이 있기 때문인데 이는 Python 자체에서 직접 가져오는 것으로 해당 소스코드는 가져올 수 없다(C 언어로 작성되어 있기 때문이다...). 참고