본문 바로가기

Django

django settings.py 분리 시키기

Settings.py 분리를 하는 이유

django를 처음 접하다보면 settings.py를 왜 분리해야하는지 아직 감이 안잡힐 것이다.

하지만 간단한 프로젝트라고 한번 완성하고난 후 배포까지 해보면 이때서야 알게 될것이다.

기본적으로 local서버와 prod서버에서의 하고자 하는 행동들이 다른다는것을

그리고 secret_key도 따로 분리하여 가지고 있어야한다.(보안을 위해서이다.)

일단 본격적으로 분리시키기전에 secret_key부터 나누고 시작할것이다.

secret key를 담고 있을 파일을 하나 만들어줘야하는데,

경로는 <프로젝트>/secret.json이라고 하나 만들어준다. (제일 상단 경로에 만들어준다. manage.py와 같은 경로)

{
    "SECRET_KEY": "...."
}

위의 SECRET_KEY는 settings.py에서 상단 부분에 길게 문자열로 표시되어있는 부분을 가져와 JSON 형식에 맞춰 넣어준다.
이후, 기존 settings.py에서 SECRET_KEY 부분을 지우고 아래의 코드를 넣어주면 된다.

import json

with open('secret.json') as file:
    secrets = json.loads(file.read())


def get_secret(setting, secret_key=secrets):
    try:
        return secret_key[setting]
    except KeyError:
        error_msg = f'Set the {setting} environment variable'
        raise ImproperlyConfigured(error_msg)

SECRET_KEY = get_secret("SECRET_KEY")

SECRET KEY를 분리 시켰다면 본격적으로 settings.py를 분리 시켜보자
django를 처음 셋팅할때 startprojec 를 할때 정해줬던 디렉토리 아래에 settings 라는 디렉토리를 하나 생성해준다.
그리고 settings.py를 base.py로 변경하고 settings 디렉토리 아래로 이동시켜준다.
이후, local.py와 prod.py를 새로 생성해준다.

스크린샷 2020-11-15 오후 6 34 14

# local.py
from .base import *

DEBUG = True
# prod.py
from .base import *

DEBUG = False

위 처럼 설정하고 마지막으로 base.py , manage.py , wsgi.py에서 변경 약간의 코드를 해줘야한다.

# base.py

...

BASE_DIR = os.path.dirname(...) # os.path.dirname을 하나 더 추가해줘야한다. 이유는 settings라는 디렉토리를 만들어서 경로가 하나 더 생겼기 때문이다.
...
# wsgi.py

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<프로젝트파일명>.settings.prod')
# manage.py

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<프로젝트파일명>.settings.local')
    ...

위 처럼 설정해주면 settings.py 분리 시키기는 완성된것이다.

'Django' 카테고리의 다른 글

django rest framework에 대해서  (0) 2021.06.19
(django template) typescript 적용시키기  (0) 2021.03.13
Django 구조  (0) 2020.10.11
django shell plus, Jupyter Notebook 설치  (0) 2020.10.11
django 시작하기  (0) 2020.10.02