이번에는 Youtube JustDjango의 Creating a Django Boilerplate 시리즈를 해보도록 하겠다.
www.youtube.com/watch?v=YxQCAyiN6_w&list=PLLRM7ROnmA9FgFlqn-HHBz0LJ62qJBwSw&index=2
※ 왜 여러개의 settings.py 파일이 필요한가?
우리는 현재 대부분 개발 - development mode로 Django를 사용한다. 하지만 만약 개발이 아닌 배포용, 즉 production mode를 올리고 싶다면 어떻게 해야될까? settings.py의 모든 부분을 다시 production에 알맞게 바꿔줘야 한다.
하지만 만약 다시 우리의 Django 웹사이트를 조금 더 수정하고 업데이트 하고 싶은데 그 전에 development mode로 여러 실험들을 해보아야 한다면 곤란한 문제가 생긴다. 계속 development mode에 알맞는 settings들과 production mode에 알맞는 settings들을 번갈아가면서 바꾸어줘야 하기 때문이다.
이때 사용할 수 있는 방법이 development mode의 settings.py 파일과 production mode의 settings.py 파일을 분리시키고 이를 단순히 몇줄의 설정만 바꿔주면 developmet mode의 파일과 production mode의 파일을 번갈아가면서 사용 할 수 있기 때문이다.
※ settings 폴더 만들고 수정하기
scr
ㄴdemo
ㄴ__pycache__
ㄴsettings
ㄴ__init__.py
ㄴbase.py
ㄴdevelopment.py
ㄴproduction.py
ㄴ__init__.py
ㄴasgi.py
ㄴurls.py
ㄴwsgi.py
ㄴdb.sqlite3
ㄴmanage.py
우선 settings라는 폴더를 만들어주고, 기존에 있던 settings.py를 다시 settings라는 폴더로 옮겨준다. settings.py의 이름은 다시 base.py로 수정시켜준다.
__init__.py를 만들어주고, development.py 랑 production.py를 만들어준다.
# development.py
from .base import *
DEBUG = True
ALLOWED_HOSTS = ['127.0.0.1']
INSTALLED_APPS += [
'debug_toolbar',
]
MIDDLEWARE += [
'debug_toolbar.middleware.DebugToolbarMiddleware',
]
#DEBUG TOOLBAR SETTINGS
DEBUG_TOOLBAR_PANELS = [
'debug_toolbar.panels.versions.VersionsPanel',
'debug_toolbar.panels.timer.TimerPanel',
'debug_toolbar.panels.settings.SettingsPanel',
'debug_toolbar.panels.headers.HeadersPanel',
'debug_toolbar.panels.request.RequestPanel',
'debug_toolbar.panels.sql.SQLPanel',
'debug_toolbar.panels.staticfiles.StaticFilesPanel',
'debug_toolbar.panels.templates.TemplatesPanel',
'debug_toolbar.panels.cache.CachePanel',
'debug_toolbar.panels.signals.SignalsPanel',
'debug_toolbar.panels.logging.LoggingPanel',
'debug_toolbar.panels.redirects.RedirectsPanel',
'debug_toolbar.panels.profiling.ProfilingPanel',
]
def show_toolbar(request):
return True
DEBUG_TOOLBAR_CONFIG = {
'INTERCEPT_REDIRECTS': False,
'SHOW_TOOLBAR_CALLBACK': show_toolbar
}
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
이렇게 development.py에는 우리가 development mode에서만 쓸 설정들을 추가해준다. base.py에 있던 위의 설정들은 삭제해준다.
# production.py
from .base import *
DEBUG = False
ALLOWED_HOSTS = ['ip-address', 'www.your-website.com']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'your-db-name',
'USER': 'your-db-user-name',
'PASSWORD': 'your-db-password',
'HOST': 'localhost',
'PORT': '',
}
}
prouction.py는 위와 비슷하게 쓸 수 있을 것이다. 쓴 것과 같이 Database를 postgress를 사용하고 싶다면, 위와 같은 설정을 할 수 있을 것이다.
※ manage.py 수정하기
하지만 이렇게 한다고 다 끝난 것은 아니다. manage.py를 살펴보자:
# manage.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'demo.settings')
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()
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'demo.settings')를 본다면, demo라는 폴더 안에 settings라는 파일로 지정한다는 것을 'demo.settings'에서 알 수 있다. 하지만 위의 수정들을 통해 우리는 settings라는 파일을 없애고, settings라는 폴더 안에 development.py 또는 production.py를 이용하여 상황에 알맞게 사용하려고 한다. 따라서 다음과 같이 수정해준다;
# manage.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'demo.settings.development')
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()
development.py 를 사용한다면 development, production.py를 사용한다면 production으로 수정해준다.
※ BASE_DIR 수정하기
마지막으로는 BASE_DIR를 수정해주어야한다:
BASE_DIR = Path(__file__).resolve().parent.parent
현재는 위와 같이 되어 있으나, 이를 수정하지 않으면 현재 나의 BASE_DIR은 다음과 같이 출력된다:
>>> C:\Users\your user name\Desktop\projects\boilerplate\src\demo
이것은 settings.py 파일이 어디있는지 알려주는 BASE_DIR이기 때문에, 제대로 db.sqlite를 불러와주기 위해서는 다음과 같이 바꿔줘야 한다:
BASE_DIR = Path(__file__).resolve().parent.parent.parent
이렇게 개발 모드와 배포 모드에서 혼잡함과 깔끔한 정리를 위해 settings.py를 위와 같이 여러개로 분리한다면 매우 좋을 것이다.