웹 프로그래밍

[Django Tutorial] Blog 만들기 (7)

728x90
반응형

settings.py 분리

개발과정에서 settings.py와 개발이 끝난 후 소스를 운영서버에 배포하는 경우에 settings.py 가 달라지기 때문이다.

(SECRET_KEY, DEBUG, ALLOWED_HOSTS, DATABASES 를 변경할 것)

 

1. mysite 아래 settings python package를 생성

: settings 밑에는 기존의 settings.py를 (1) base.py, (2) develop.py, (3) product.py 로 분리할 것이다.

(1) 공통항목, (2) 개발모드에서만 필요한 항목들, (3) 운영모드에서만 필요한 설정항목들

 

2. 기존의 settings.py를 mysite/settings 아래로 cut/paste 후 이름을 base.py로 변경해준다.

 

3. 파일의 위치가 한단계 밑으로 내려왔기때문에 BASE_DIR을 변경한다.

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

:이렇게해야 BASE_DIR이 backend를 가리킨다.

 

4. 개발모드와 운영보드에서 다르게 설정할 항목들은 base.py에서 지워준다.

(SECRET_KEY, DEBUG, ALLOWED_HOSTS, DATABASES) 

 

5. mysite/settings/develop.py 와 mysite/settings/product.py 생성

 

6. develop.py

from .base import *


SECRET_KEY = 'base.py에서 삭제한 시크릿키'

DEBUG = True

ALLOWED_HOSTS = []

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

django에서는 DEBUG가 True면 개발모드, False면 운영모드로 인식한다. 개발모드에서는 ALLOWED_HOSTS를 공백으로 둬도 괜찮은데 공백으로 두면 django는 ALLOWED_HOSTS=['localhost', '127.0.0.1'] 로 인식한다.

 

7. product.py

import os

from .base import *


SECRET_KEY = os.environ['SECRET_KEY']

DEBUG = False

#AWS EXAMPLE
ALLOWED_HOSTS = ['.elasticbeanstalk.com']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ['DATABASE_NAME'],
        'USER': os.environ['DATABASE_USER'],
        'PASSWORD': os.environ['DATABASE_PASSWORD'],
        'HOST': 'django-mysql.ap-northeast-2.rds.amazonaws.com',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
    }
}

민감한 정보는 환경변수로 가져온다. 운영모드에서는 ALLOWED_HOSTS를 반드시 적어주어야한다.  

 

8. settings를 호출하는 부분을 변경

개발모드는 manage.py에서 호출해주고 운영모드는 wsgi.py에서 호출해준다.

 

manage.py

import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings.develop')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

develop.py를 호출하도록 바꾸어준다 : mysite.settings.develop

 

wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings.product')

application = get_wsgi_application()

product.py를 호출하도록 바꾸어준다 : mysite.settings.product

 

 

728x90
반응형