プログラミング

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

プログラミング
この記事は約5分で読めます。
スポンサーリンク

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を環境変数に追加できるようなスクリプトを作っておけば良さそうですね。

スポンサーリンク
スポンサーリンク
スポンサーリンク
KoEをフォローする
CodeLab

コメント

タイトルとURLをコピーしました