ざきの学習帳(旧 zackey推し )

日々の学びを書きます

【Django】settings.pyを分割する際の修正範囲

Djangoでローカル・ステージング・本番環境別の設定をどう分割するか、以下の書籍や記事で記述されています。

上記を参考にsettings.pyを分割した際の修正範囲を書き残しておきたいと思います。

修正範囲

以下のコミットを参考に記載します。

環境情報

本記事を書いた(コミットした際)の環境情報です。

  • Djangoのバージョンは3.0.6
  • django-admin startproject configで生成したDjangoアプリケーション

1. settings.pyの内容をconfig/settings/env.pyへ分割

config/settings.pyの内容を環境ごとの設定ファイルに分割します。

ファイル 設定内容
config/settings/base.py 共通設定内容
config/settings/local.py ローカル環境の設定内容
config/settings/production.py 本番環境の設定内容

私が分割対応した際は、Django Debug Toolbarをローカル環境でのみ有効とする対応をしました。ローカル環境の設定内容config/settings/local.pyは、以下のようなイメージです。

# https://github.com/zakizaki-ri9/python-sandbox/blob/c49c433657f3d150d2e75ca5ff7f794e462facc8/django-rest-tutorial/config/settings/local.py
# config/settings/local.py

# base.pyから共通設定をインポート
from .base import *

DEBUG = True

# Django Debug Toolbarを有効化
INSTALLED_APPS += [
    "debug_toolbar",
]

MIDDLEWARE += [
    "debug_toolbar.middleware.DebugToolbarMiddleware",
]

INTERNAL_IPS = ["127.0.0.1"]

2. BASE_DIRの修正

config/settings.pyからconfig/settings/base.pyへ階層が深くなったため、BASE_DIR(プロジェクトのベースフォルダ)を以下に修正します。1

# https://github.com/zakizaki-ri9/python-sandbox/blob/c49c433657f3d150d2e75ca5ff7f794e462facc8/django-rest-tutorial/config/settings/base.py#L15-L17
# config/settings/base.py

# BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

os.path.dirnameを1つ追加・括ることで、一階層上のディレクトリ(ルートディレクトリ)を指すようになります。

3. ローカル・本番環境の設定ファイルを読み込む

django-admin startproject config後、変更していないければ、以下で設定ファイルの読み込みを行なっています。

  • config/manage.py
  • config/wsgi.py

それぞれ以下のように修正します。

# https://github.com/zakizaki-ri9/python-sandbox/commit/c49c433657f3d150d2e75ca5ff7f794e462facc8#diff-6a6b249dd0d4b2836634706d26f7bdf0L8-L9
# config/manage.py

# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
# https://github.com/zakizaki-ri9/python-sandbox/commit/c49c433657f3d150d2e75ca5ff7f794e462facc8#diff-11002d4a5ad099d4417bae2e08328d75L14-L15
# config/wsgi.py

# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")

おわり

Railsだと、デフォルトで環境ごとに設定ファイルを使用する仕組みが提供されていました。

railsdoc.com

改めてRailsの汎用性の高さを思い知りました。

しばらく触らなくなると思うと、少し寂しい気持ちになります...。


以上になります。内容に不備等ありましたら、フィードバックいただけると幸いです。


  1. 修正しない場合、BASE_DIRの位置がdjango-admin startproject configで指定したディレクトリ(config)となります。ローカル環境にて、プロジェクト配下にデフォルトで生成されるSQLite(db.sqlite3)を使用している場合は、その位置がconfigディレクトリ配下に変更されてしまいます。