이미 기능을 하는 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
복사
nginx나 uwsgi의 설정은 나중에 다룬다. 여기서는 settings.py와 wsgi.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.