본문 바로가기

Framework/Django

[Django] Settings

반응형

Django project 를 실행하기 위해서는 여러가지 설정을 해주어야 한다. 이러한 설정은 django 의 settings 모듈에 정의된다. 이 글에서는 django settings 에 대해서 알아보고 상황에 따라 다른 settings 를 적용할 수 있도록 구성해보는 방법을 정리해본다.

1. Django settings

- settings.py

Django project 를 생성하면 project app 아래에 settings.py 모듈이 자동으로 생성된다. 이 파일은 django project 에 적용되는 여러가지 설정들을 정의해놓은 모듈이다. Django project 를 실행하면 프레임워크 내부에서는 settings 모듈에 정의된 값들을 기반으로 서버가 실행된다.

- DJANGO_SETTINGS_MODULE

Django project 를 실행할 때는 설정 모듈의 위치를 정의해주어야 한다. 위치는 환경변수인 DJANGO_SETTINGS_MODULE 의 값으로 정의할 수 있다.

DJANGO_SETTINGS_MODULE 의 값은 파이썬 경로 문법을 통해 정의해야 하는데, project root 를 기준으로 'myproject.settings' 와 같이 정의하면 된다.

아래는 터미널에서 환경변수를 정의하는 예제이다.

 

$ set DJANGO_SETTINGS_MODULE=myproject.settings

- manage.py

Django manage.py 를 이용하여 서버를 실행하거나 django 의 기능을 사용할 때에도 DJANGO_SETTINGS_MODULE 의 값을 기반으로 설정 모듈을 가져와서 사용한다.

아래는 manage.py 의 일부분으로 모듈 실행시에 DJANGO_SETTINGS_MODULE 의 기본값을 설정하는 코드이다. settings 의 기본 경로는 project 디렉토리 아래의 settings.py 이기 때문에 이와같이 구현되어 있다.

 

# manage.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

- django.conf.settings

Django application 에서 settings 를 사용할 때는 django.conf 의 settings 객체를 사용한다. 이 코드를 확인해보면 어떻게 DJANGO_SETTINGS_MODULE 을 사용하는지 알 수 있다.

# django.conf.__init__.py
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"

class LazySettings(LazyObject):
    def _setup(self, name=None):
        """
        Load the settings module pointed to by the environment variable. This
        is used the first time settings are needed, if the user hasn't
        configured settings manually.
        """
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)

        # ...

        self._wrapped = Settings(settings_module)

    # ...

settings = LazySettings()

 

Django project 가 실행될때 settings 객체를 생성하는데, 이때 DJANGO_SETTINGS_MODULE 의 경로에 있는 모듈을 읽어와서 이를 settings 객체에 저장하는 식으로 application 에서 사용한다.

2. Settings 사용

- settings 객체

from django.conf import settings

if settings.DEBUG:
    print("DEBUG MODE")

 

Django application 에서 django 설정을 사용하기 위해서는 django.conf.settings 객체를 import 하여 사용해야 한다. settings 는 모듈이 아닌 객체이기 때문에 settings 내부의 설정 변수를 바로 import 할 수 없고, settings 객체를 통해서만 호출할 수 있다.

settings 를 사용할 때 주의할 점은 런타임에는 설정값을 변경할 수 없다는 것이다. 설정은 project 실행 전 settings 모듈에서만 변경할 수 있다.

- multi settings

실행 모드에 따라 다른 설정을 사용해야 하는 경우가 있다. 예를 들어 테스트, 로컬, 운영 환경은 각각 다른 설정을 사용해야 한다. 이러한 상황에는 하나의 settings 모듈이 아닌 상황별로 다른 여러개의 settings 를 작성해놓고 상황에 따라 다른 settings 를 적용하도록하여 해결할 수 있다.

예제에서는 아래와 같이 기존의 myproject 아래에 settings 디렉토리를 생성하고 base.py, local.py, test.py 라는 새로운 settings 모듈들을 작성했다.

 

myproject/settings/
├── base.py
├── local.py
└── test.py

 

여기서 base.py 는 기존의 myproject.settings 모듈로, 기존 경로에서 myproject/settings/ 아래로 옮기고 base.py 로 파일명을 변경했다. 그리고 local.py 와 test.py 는 각각 아래와 같이 base 모듈을 import 하도록하여 기본 설정들을 모두 import 하고 필요한 경우 각각의 모듈에서 설정을 덮어씌우도록 settings 구조를 구성했다.

 

# local.py
from myproject.settings.base import *

SETTINGS_MODE = "LOCAL"

# test.py
from myproject.settings.base import *

SETTINGS_MODE = "TEST"

- multi settings 사용

이제 각각의 상황에서 원하는 settings 를 import 하도록 하여 사용하면 된다. 아래와 같이 환경변수 DJANGO_SETTINGS_MODULE 의 경로를 변경해주거나 manage.py, wsgi.py, asgi.py 등에서 DJANGO_SETTINGS_MODULE 의 기본값을 설정해주는 코드를 수정하여 사용해도 된다.

 

$ set DJANGO_SETTINGS_MODULE=myproject.settings.local

 

# manage.py
def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.local')
    ...

[References]

- https://docs.djangoproject.com/en/6.0/topics/settings/

 

Django settings | Django documentation

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

반응형

'Framework > Django' 카테고리의 다른 글

[Django] Logging  (0) 2025.12.29
[Django] Caching  (1) 2025.12.27
[Django] Model Query  (0) 2025.12.13
[Django] Model 정의와 Migration  (0) 2025.12.09
[Django] Django app 생성  (0) 2025.12.07