본문 바로가기

Django

설정 파일 분리하기

장고 프로젝트를 상용화 하기 위해서는 설정파일 분리가 필수적이다. 설정파일을 분리해야 개발 버전과 프로덕션 버전의 설정을 나눌 수 있다.

 

이 글은 장고 프로젝트를 2가지 버전으로 나눠서 운영한다고 가정

 

- dev : 개발용 테스트 서버를 위한 설정

- prod : 실재 상용 서비스 프로덕션 버전을 위한 설정

 

 

 

1. settings 폴더 만들기

 

가장 먼저 기존 settings.py 가 있는 위치에 settings 라는 폴더를 생성한다

 

project/config/settings.py  가 있다면 project/config/settings/ 

 


 

2. 설정 파일 생성하기

 

총 3개의 파일을 생성한다.

 

project/config/settings/base.py
project/config/settings/dev.py
project/config/settings/prod.py

 

A) base.py

 

해당 파일은 공통 설정 파일이다. dev와 prod로 나눌 필요가 없는 공통 파일을 작성하면 된다.

기존 있던 settings.py를 복사하여 만든다

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
ROOT_DIR = os.path.dirname(BASE_DIR)

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True


# Application definition
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    .
    .
    .
    "django_rest_passwordreset",
    "corsheaders",
]

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    .
    .
    .
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.common.CommonMiddleware",
]

.
.
.

 

 

B) dev.py

 

개발용 셋팅을 위한 설정 파일이다.

아래 예제와 같이 개발 버전에서 적용할 내용을 설정하면 기본 base.py 의 셋팅을 덮어씌기 해서 적용된다

from .base import *

DEBUG = True

ALLOWED_HOSTS = ["localhost"]

 

 

C) prod.py

 

상용 서버용 설정 파일이다. 상용 서버에 적용할 설정을 입력한다.

 

from .base import *  

DEBUG = False
ALLOWED_HOSTS = ["naver.com"]

 

 


 

 

3. 사용하기

 

이렇게 설정 파일을 분리했으면 장고 명령어를 사용할때 해당 설정 파일을 같이 넘겨줘야 한다.

 

python manage.py runserver --settings=config.settings.dev
python manage.py runserver --settings=config.settings.prod

python manage.py makemigrations --settings=config.settings.dev
python manage.py makemigrations --settings=config.settings.prod

python manage.py migrate --settings=config.settings.dev
python manage.py migrate --settings=config.settings.prod

python manage.py collectstatic --settings=config.settings.dev
python manage.py collectstatic --settings=config.settings.prod

 


 

4. 실재 서버에 배포시

 

보통 장고를 서버에 배포할때는 wsgi를 사용하는데, 설정 파일을 분리했으면 wsgi 실행 시에도 환경 설정 파일을 넘겨줘야 한다.

 

wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.dev")
#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.prod")

application = get_wsgi_application()

해당 부분을 if 문 처리할 수도 있지만 이 부분이 재대로 설정하지 않으면 서버 셋팅에 고생을 하게 되니 서버 셋팅에 자신이 없다면 환경에 맞춰서 해당 부분을 하드코딩하는 것을 추천한다.