Djangoを本番環境でデプロイするときにsetting.pyを分けたい。
DEBUGやDATABASESなどが環境で分けたくなる。
以下のようにsettingディレクトリを作成し、もともとのsetting.pyをbase.pyにリネーム、init.pyの空ファイルを作成する。
project_name
├─ project_name
│ ├─ settings
│ │ ├─ __init__.py # 空ファイル
│ │ ├─ base.py # 共通設定
│ │ ├─ development.py # 開発環境設定
│ │ └─ production.py # 本番環境設定
│ └─ urls.py
│ └─ wsgi.py
└─ manage.py
変更箇所
環境変数を設定する
shell
$ export DJANGO_SETTINGS_MODULE=project_name.settings.production
BASE_DIRを定義する階層が一つ深くなったのでparentを追加する。
base.py
- BASE_DIR = Path(__file__).resolve().parent.parent
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
環境変数が設定されていないときproject_name.settings.developmentを読み込む。
manage.py
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings.development ')
wsgiは環境変数を読み込めない。しかしwsgiを使うのは本番環境だけなのでデフォルトでproductionを指定する。
wsgi.py
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings.production ')
上の方法でもできるがdotenvを用いて.envにDJANGO_SETTINGS_MODULEを環境変数設定しておき読み込むことでwsgiが環境変数を読み込めないことをクリアし、manage.pyもwsgiもデフォルトをdevelopmentに設定できるかもしれない。