django の settings.py を本番と開発で分ける

2021年10月24日

参考

【Django】settings.pyを分割する際の修正範囲

階層

before

.
├── config
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py # 削除
│   ├── urls.py
│   └── wsgi.py
└── manage.py

after

.
├── config
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings           # 作成
│   │   ├── __init__.py    # 作成
│   │   ├── base.py        # 作成
│   │   ├── development.py # 作成
│   │   └── production.py  # 作成
│   ├── urls.py
│   └── wsgi.py # 修正
└── manage.py   # 修正

ファイルの修正

base.py

settings.py の内容を base.py に全て移します。
settings.py を削除します。

階層が深くなったので base.py の BASE_DIR に「.parent」 を一つ付け加えます。
【base.py】

BASE_DIR = Path(__file__).resolve().parent.parent.parent # 修正後

wsgi.py

本番環境でWSGI から呼び出されたときには production.py 使用するように修正します。
【wsgi.py】

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production') # 修正後

application = get_wsgi_application()

manage.py

開発環境で manage.py から呼び出されたときには development.py を使用するように修正します。
【manage.py】

import os
import sys

def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.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()

production.py

本番環境のみで使用するファイルを production.py に記載します。今回は下記の 3 点のみとします。
【production.py】

from .base import *

DEBUG = False

ALLOWED_HOSTS = ["111.222.333.444"]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'production_database',
        'USER': 'django_user',
        'HOST': 'production',
        'PORT': 3306,
    }
}

development.py

開発環境のみで使用するファイルを development.py に記載します。今回は下記の 3 点のみとします。
【development.py】

from .base import *

DEBUG = True

ALLOWED_HOSTS = ["*"]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'development_database',
        'USER': 'django_user',
        'HOST': 'development',
        'PORT': 3306,
    }
}

base.py

production.py や development.py に書き出した DEBUG や ALLOWED_HOSTS DATABASES の項目を settings.py から削除します。

YouTube

2021年10月24日