Django Logo

[Django]環境ごとに設定ファイルを切り替える方法

Django のアプリ開発時に開発、検証、本番環境で設定値が切り替わる「 DB接続先 」や「 CORS の設定」などを手作業で行っていたんですが、さすがにデプロイ時などにミスが出そうなので settings を環境ごとに切り替えることにしました。
今回は settings を環境ごとに切り替える方法を説明していきたいと思います。
settings.py で設定する下記の内容を環境ごとに切り替えられるようになります。

  • DB 接続先の情報
  • CORS の設定
  • Email 設定
  • デバッグフラグ

上記以外にも settings.py で設定しているものは基本切り替え可能です。

setting.py を分割する

アプリを django-admin startproject コマンドで作成すると settings.py が作成されるんですが、そのファイルを分割していきます。
今回は開発環境、検証環境、本番環境で環境を分割したいと思います。

以下のように分割します。

project_name
├─ project_name
│    ├─ settings
│    │    ├─ __init__.py
│    │    ├─ base.py # 共通設定
│    │    ├─ development.py # 開発環境設定
│    │    ├─ production.py # 本番環境設定
│    │    └─ staging.py # 検証環境設定
│    ├─ __init__.py
│    ├─ asgi.py
│    ├─ urls.py
│    └─ wsgi.py
└─ manage.py

共通設定は base.py に設定します。
development.py, production.py, staging.py にはそれぞれ、開発環境、本番環境、検証環境の設定を追記します。

base.py に記述する設定

base.py には環境共通で使用する設定を実装します。

  • BASE_DIR
  • INSTALLED_APPS
  • MIDDLEWARE
  • ROOT_URLCONF
  • TEMPLATES
  • WSGI_APPLICATION
  • AUTH_PASSWORD_VALIDATORS
  • その他の設定

環境ごとに記述する設定

環境ごとに切り替えが必要な設定を development.py, production.py, staging.py それぞれに実装します。

  • SECRET_KEY
  • DEBUG
  • DATABASE
  • その他切り分けが必要な設定

それぞれの環境での設定値については開発中のアプリに応じて設定していきます。

ファイル分割に伴う修正点

BASE_DIR

BASE_DIR を定義する階層が一つ深くなったので、下記のように修正します。

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

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

manage.py

デフォルトの実行で開発環境の設定を読み込むようにしておきます。
起動時に DJANGO_SETTINGS_MODULE を環境変数に追加するか、 runserver コマンド実行時に --settings オプションを指定しない場合に開発環境として起動します。
下記の実装を main() 関数内に実装します。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings.development ')

wsgi.py

wsgi.py にも DJANGO_SETTINGS_MODULE を設定する処理を実装します。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings.development ')

asgi.py を使用している場合は asgi.py に上記の処理を追加します。

実行方法

今回の設定を実行する方法は2つあります。

  • 環境変数に DJANGO_SETTINGS_MODULE を追加する
  • runserver コマンドに --settings オプションを追加する

環境変数を追加する場合、下記のように実行します。

$ export DJANGO_SETTINGS_MODULE=project_name.settings.production # 本番環境設定に切り替わる
$ python manage.py runserver 0.0.0.0:80

検証環境の場合、

$ export DJANGO_SETTINGS_MODULE=project_name.settings.staging # 検証環境設定に切り替わる
$ python manage.py runserver 0.0.0.0:80

runserver コマンドに --settings オプションを追加する場合、下記のように実行します。

$ python manage.py runserver --settings=project_name.settings.production 0.0.0.0:80 # 本番環境設定に切り替わる
$ python manage.py runserver --settings=project_name.settings.staging 0.0.0.0:80 # 検証環境設定に切り替わる

最後に

環境変数をあらかじめ検証環境や本番環境のサーバへ設定しておけば、アプリ起動時に DJANGO_SETTINGS_MODULE を環境変数に設定する必要がなくなるので、サーバ起動時に DJANGO_SETTINGS_MODULE を環境変数に追加できるようなスクリプトを作っておけば良さそうですね。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です