🎏

1. 프로젝트 세팅

Created
2020/12/26 04:29
Tags
이미 기능을 하는 Django 프로젝트가 존재한다는 가정 하에, 프로젝트를 다음과 같이 구성했다.
- .config/ --- nginx/ ----- [project].conf --- uwsgi/ ----- [project].ini ----- uwsgi.service - [project] --- .config_secret/ ----- settings_common.json ----- settings_debug.json ----- settings_deploy.json --- settings/ ----- base.py ----- debug.py ----- deploy.py --- wsgi/ ----- debug.py ----- deploy.py --- static/ - .static_root/ - .gitignore - manage.py - requirements.txt
Plain Text
복사
nginxuwsgi의 설정은 나중에 다룬다. 여기서는 settings.pywsgi.py를 각각 개발용/배포용으로 나눈 것을 설명한다.

.config_secret

우선 .config_secret은 secret key나 user authentication과 같이 외부에 노출되어서는 안 되는 정보를 담기 위한 디렉토리이다. 그렇기 때문에 우선 .gitignore 파일에 .config_secret/를 추가해 github에 올라가지 않도록 하자. 그 다음 각각의 파일을 다음과 같이 설정한다.
// settings_common.json { "django": { "secret_key": "YOUR_DJANGO_PROJECT_SECRET_KEY" } } // settings_debug.json { "django": { "allowed_hosts": [ "localhost", "127.0.0.1" ] } } // settings_deploy.json { "django": { "allowed_hosts": [ ".ap-northeast-2.compute.amazonaws.com", "SOME_HOSTS_YOU_NEED" ], "databases": { "host": "DATABASE_ENDPOINT", "user": "DATABASE_USERNAME", "password": "DATABASE_PASSWORD" } } }
JSON
복사

settings

이제 기존에 존재하던 settings.py 파일을 다음과 같은 파일들로 대체한다.
# base.py import os import json BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ROOT_DIR = os.path.dirname(BASE_DIR) # 위에서 작성한 설정 파일들을 가져온다. CONFIG_SECRET_DIR = os.path.join(ROOT_DIR, '[project]/.config_secret') CONFIG_SECRET_COMMON_FILE = os.path.join(CONFIG_SECRET_DIR, 'settings_common.json') CONFIG_SECRET_DEBUG_FILE = os.path.join(CONFIG_SECRET_DIR, 'settings_debug.json') CONFIG_SECRET_DEPLOY_FILE = os.path.join(CONFIG_SECRET_DIR, 'settings_deploy.json') config_secret_common = json.loads(open(CONFIG_SECRET_COMMON_FILE).read()) # 위에서 설정한 파일에서 가져온다. SECRET_KEY = config_secret_common["django"]["secret_key"] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ... ] MIDDLEWARE = [ YOUR_MIDDLEWARE_LIST ] ROOT_URLCONF = '[project].urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] LANGUAGE_CODE = 'en-us' TIME_ZONE = 'Asia/Seoul' USE_I18N = True USE_L10N = True USE_TZ = True # 나중에 서버에서 실행할 collectstatic을 위해 필요한 설정이다. STATIC_URL = '/static/' STATIC_DIR = os.path.join(BASE_DIR, 'static') STATICFILES_DIRS = [ STATIC_DIR, ] STATIC_ROOT = os.path.join(ROOT_DIR, '.static_root')
Python
복사
# debug.py from .base import * config_secret_debug = json.loads(open(CONFIG_SECRET_DEBUG_FILE).read()) DEBUG = True ALLOWED_HOSTS = config_secret_debug['django']['allowed_hosts'] WSGI_APPLICATION = '[PROJECT_NAME].wsgi.debug.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(ROOT_DIR, 'db.sqlite3'), } }
Python
복사
# deploy.py from .base import * config_secret_deploy = json.loads(open(CONFIG_SECRET_DEPLOY_FILE).read()) DEBUG = False ALLOWED_HOSTS = config_secret_deploy['django']['allowed_hosts'] WSGI_APPLICATION = '[PROJECT_NAME].wsgi.deploy.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': config_secret_deploy['django']['databases']['user'], 'PASSWORD': config_secret_deploy['django']['databases']['password'], 'HOST': config_secret_deploy['django']['databases']['host'], 'PORT': '5432', } }
Python
복사

wsgi

기존에 존재하던 wsgi.py 파일을 다음의 파일들로 대체한다.
# debug.py import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "[PROJECT_NAME].settings.debug") application = get_wsgi_application() # deploy.py import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "[PROJECT_NAME].settings.deploy") application = get_wsgi_application()
Python
복사
마지막으로 manage.py 파일을 다음과 같이 수정해주면 Django 프로젝트 세팅은 끝이 난다.
import os import sys def main(): # 디폴트 setting을 변경한다. os.environ.setdefault('DJANGO_SETTINGS_MODULE', '[PROJECT_NAME].settings.deploy') 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()
Python
복사
위는 Django application 실행 시 default로 가져 올 설정 파일을 지정한 것이다. 위에서는 편의상 deploy로 default를 설정해 놓았다. 이제 로컬에서 (개발을 위해) manage.py 이용할 때는 다음과 같이 settings 옵션과 함께 해야 한다.
python manage.py [actions] --settings=[project].settings.debug
Plain Text
복사
이렇게 Django 프로젝트 세팅은 끝.
E.O.D.