출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

이번에는 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 modesettings.py 파일과 production modesettings.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.pyproduction.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는 위와 비슷하게 쓸 수 있을 것이다. 쓴 것과 같이 Databasepostgress를 사용하고 싶다면, 위와 같은 설정을 할 수 있을 것이다.

 

 

※ 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를 위와 같이 여러개로 분리한다면 매우 좋을 것이다.