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 # 本番環境固有設定ファイル
手順は以下の流れになります。
- settingsディレクトリを作成し、その中に各種設定情報をコーディングする
- base.pyには全ての共通的な設定を入れる
- 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に設定しておき、起動スクリプトを実行するのを推奨します。