[Django] settings.pyを環境毎に切り替える方法。本番、開発、ローカル環境に分割する。

Djangoのアプリ開発ではsettingsを各環境で切りかける方法を紹介します。
この方法を使用すれば、

  • DBの接続先
  • 静的ファイル(CSS/JS)の配置先
  • SECRET_KEY
    などを環境ごとに分けることができます。
目次

setttingsの切り替え方針

以下の方針でsettings.pyを分けていきたいと思います。

  • 本番、開発、ローカル環境ごとに切り替えられるsettings.pyを修正
  • Djangoの起動時にはDJANGO_SETTINGS_MODULE`を環境変数や`--settingsで設定して各環境を切り替える

ファイル・ディレクトリ構成

project/
 ├ __init__.py
 ├ asgi.py
 ├ urls.py
 ├ wsgi.py
 └ settings /
    ├ __init__.py
    ├ base.py # 共通設定ファイル
    ├ local.py # ローカル環境固有設定ファイル
    ├ development.py # 開発環境固有設定ファイル
    └ production.py # 本番環境固有設定ファイル

手順は以下の流れになりあmす。

  1. settingsディレクトリを作成し、その中に各種設定情報をコーディングする
  2. base.pyには全ての共通的な設定を入れる
  3. local.py, development.py, production.pyには環境ごとの設定を追記

base.pyに記載する設定値

以下のような全体で使い回す設定値をbase.pyに記入します。

  • BASE_DIR
  • INSTALLED_APPS
  • MIDDLEWARE
  • ROOT_URLCONF
  • TEMPLATES
  • その他ライブラリの設定

ローカル環境、開発環境用のsettings.py

ローカル(local.py)、開発(development.py)環境用のファイルには環境ごとに使い分ける必要がある設定値を記載する。

  • SECRET_KEY
  • DEBUG = True
  • ALLOWED_HOSTS = ['IP Address', 'hostname']
  • DATABASE

なお、ローカル環境や開発環境にはデバック用のアプリとしてdebug_toolbarを入れておくことをオススメします。

INSTALLED_APPS += [
    "debug_toolbar",
]

本番環境用のsettings.py

本番環境では下記を設定します。
特にSECRET_KEYは他の環境と重複しないことが重要です。
またDEBUGをTrueにするとエラー時にデバッグログが表示されてしまうためセキュリティリスクが高まります。

  • SECRET_KEY
  • DEBUG = False
  • ALLOWED_HOSTS = ['IP Address', 'hostname']
  • DATABASES

BASE_DIR の修正

階層が1つ潜ってしまったため、BASE_DIRを修正します。

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

manage.py の修正

デフォルトでlocal環境の設定を読み込むように設定。
起動時にDJANGO_SETTINGS_MODULE `を環境変数に設定するか、runserverの時に`--settingsを指定しない場合は、ローカル環境として起動されます。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings.local')

wsgi.pyまたはasgi.pyの修正

デフォルトでlocal環境の設定を読み込むように設定。
起動時にDJANGO_SETTINGS_MODULE `を環境変数に設定するか、runserverの時に`--settingsを指定しない場合は、ローカル環境として起動されます。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings.local')

開発環境と本番環境の起動

開発環境と本番環境の起動時には2つの方法があります。

  • DJANGO_SETTINGS_MODULEを環境変数に設定
  • --settingsを起動オプションに追加

今回は本番環境の起動方法で説明します。

環境変数を設定する場合は以下の方法になります。

exponrt DJANGO_SETTINGS_MODULE=project.settings.production
python manage.py runserver 0.0.0.0:80

--settingsを設定する場合は以下の方法になります。

python manage.py runserver --settings=project.settings.production 0.0.0.0:80

個人的には環境変数で動作を変えることが出来るため、.envファイルなどDJANGO_SETTINGS_MODULEに設定しておき、起動スクリプトを実行するのを推奨します。

目次
閉じる