Django Docs | Settings

Jihun Kim·2022년 3월 1일
0

Django Docs

목록 보기
7/9
post-thumbnail
post-custom-banner

Settings 지정하기

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을 넘겨주는 방법을 이용할 수 있다.

  1. 환경 변수 지정하기
    • 아래는 bash shell일 경우의 예시이다.
	export DJANGO_SETTINGS_MODULE=mysite.settings
	django-admin runserver
  1. 서버를 실행할 때마다 명시적으로 환경 변수 넘겨주기

    • 내가 사용하고 있는 파이참의 경우 preferences > console > Django Console에서 환경 변수를 지정해 줄 수 있다.
    	django-admin runserver --settings=mysite.settings
    • Django console에 DJANGO_SETTINGS_MODULE=MySite.settings.project.api.local_api와 같이 환경 변수를 저장해 놓으면 된다.

Default settings

장고 설정 파일에는 적절한 기본 값이 정의되어 있기 때문에 필요하지 않은 경우 따로 설정을 정의할 필요가 없다.
해당 기본값들은 django/conf/global_settings.py 모듈에 정의되어 있다.

장고가 settings를 컴파일(프로그래머가 작성한 소스코드를 바이너리 파일로 변환하는 과정)하는 알고리즘은 다음과 같다.

  • global_settings.py를 로드한다.
  • 특정한 settings 파일(django/conf/settings.py)에 정의된 settings를 로드한다. 이 때 settings 파일은 필요한 경우 global settings를 오버라이딩 할 수도 있다.
    - 우리가 사용하게 될 settings는 여기에 있다.

이 때, settings file은 global_settings.py에 정의된 모든 설정들을 불러올 필요는 없다. 왜냐하면 여기에는 너무 많은 양의 세팅 값들이 정의되어 있기 때문이다.

만약 기본 설정값과 내가 정의한 설정값에 어떤 차이가 있는 지를 확인하고 싶다면 python manage.py diffsettings를 명령어를 실행하면 된다.


파이썬 코드로 settings 사용하기

장고 앱에서 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는 아마도 장고앱과 장고 세팅 사이의 상호작용 시스템을 의미하는 것 같다.


사용 가능한 settings

BASE_DIR

  • BASE_DIR는 장고 프로젝트의 기본 루트 디렉토리를 지정한다.
    - manage.py 파일이 들어 있는 폴더를 루트 디렉토리로 지정한다.
  • 만약 settings가 다음과 같은 구조로 정의되어 있다고 해보자.
    - User > django-proejct > MyProject(루트) > MyProject > settings > base.py(세팅 파일)
    - 그러면 BASE_DIR는 '/User/django-project/MyProject'가 되어야 하므로 BASE_DIR는 아래와 같이 지정해야 한다.
	BASE_DIR = os.path.dirname(
    	os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
	) 
  • os.path.abspath(__file__)는 현재 파일의 절대 경로를 획득한다.
  • os.path.dirnamebase.py 파일이 들어 있는 폴더 이름을 찾는다.
  • 따라서 아래의 경우 첫 번째 괄호 안에서 '/User/django-project/MyProject/settings/base.py'를 얻게 되고 해당 dirname인 '/User/django-project/MyProject/Myproject/settings/'를 얻게 된다.
  • 이와 같은 방식으로 dirname을 찾아 나가면 루트 디렉토리를 찾을 수 있다.

ROOT_URLCONF

  • default 값이 정해져 있지 않다.
  • 이는 URL 라우팅을 해주는 장고 urls의 루트 파일을 지정한다.
    - 여기서 지정한 문자열은 url 요청을 제일 먼저 받게 된다.
  • 정의한 ROOT_URLCONF 모듈은 그 아래에 여러 urls를 거느리게 되며, 요청이 들어오면 해당 urls의 views로 연결되도록 한다.
  • 아래와 같이 정의하면 Myproject 디렉토리 내의 urls.py가 URL 라우팅을 해주게 된다.
ROOT_URLCONF = 'Myproject.urls'

TEMPLATES

  • default는 빈 리스트이다.
  • 여기에는 장고에 사용될 template 엔진에 대한 설정 값이 들어간다.
  • 이 때, 각 아이템은 각 엔진에 대한 옵션이 들어간 딕셔너리 형태이다.
  • 아래와 같은 형식으로 사용된다.
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
    },
]
  • 아이템의 key 값으로는 BACKEND, NAME, DIRS, APP_DIRS, OPTIONS가 사용될 수 있다.
  1. BACKEND

    • Default 값은 없다.
    • built-in template backends로는 아래 두 가지가 있다.
      - 'django.template.backends.django.DjangoTemplates'
      - 'django.template.backends.jinja2.Jinja2'
    • BACKEND는 꼭 built-in을 사용하지 않아도 되며 mypackage.whatever.Backend와 같이 커스텀 해도 된다.
  2. NAME

    • 위에서 정의한 template engine의 별칭이다.
    • 이는 렌더링에 사용하기 위한 엔진을 고르기 위한 일종의 식별자이다.
    • 별칭은 template engines 별로 고유해야 한다.
  3. DIRS

    • default는 빈 리스트이다.
    • 이는 장고가 템플릿들을 찾는 디렉토리 경로를 지정한다.
    • 'DIRS': [ os.path.join(BASE_DIR, 'templates') ],로 지정해 놓으면 BASE_DIR/templates가 경로에 추가 되어야만 base.html 템플릿을 찾을 수 있게 된다.
      - 만약 DIR에 여러 경로가 추가되면 장고는 경로 순서대로 검색하며 템플릿을 찾는다.
  4. APP_DIRS

    • 이는 장고가 장고 앱 안의 templates 폴더에서 템플릿들을 찾을 것인지 여부를 설정한다.
    • True가 디폴트이기 때문에 기본적으로 앱 안의 templates 폴더를 검색해 템플릿을 찾는다.
  5. OPTIONS

    • default는 빈 딕셔너리이다.
    • 템프릿 backend에 넘기기 위한 추가적인 파라미터로, 사용 가능한 파라미터는 template backend에 따라 다르다(뒤에서 context_processors에 대해 다루어 보겠다.).




추가

Python의 import search path

여기를 참고했다(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']
  1. sys 모듈을 임포트 하면 해당 모듈의 함수들과 속성들을 모두 사용할 수 있다.
  2. sys.path는 현재 검색 경로를 구성하는 디렉터리 이름 목록이다.
    • 파이썬은 해당 경로들에서 .py 파일들 중 import 하려는 모듈명과 일치하는 것을 찾아볼 것이다.
    • 실제로 sys.path에 있는 모든 모듈이 .py 파일인 것은 아니다. 왜냐하면, built-in 모듈이 있기 때문인데 이는 Python 자체에서 직접 가져오는 것으로 해당 소스코드는 가져올 수 없다(C 언어로 작성되어 있기 때문이다...).



참고

settings에 관한 django docs

profile
쿄쿄
post-custom-banner

0개의 댓글