Djangoの設定ファイルを開発・本番環境用に分割する

しんぺい

こんにちは!しんぺいです。

Djangoの設定ファイルはデフォルトのままだと非常に使い辛いです。
環境に応じて設定ファイルを読み換えるということも出来ません。

今回は、設定ファイルを使いやすくし、環境によって設定ファイルを読み換えるように修正する方法を紹介します!

設定ファイルのフォルダ名を変更する

Djangoはプロジェクト作成時、特になにも設定をしないと設定ファイルのフォルダ名がプロジェクト名になります。

これは分かり辛いですしなんか嫌なので、configというフォルダ名に変更します。基本的にフォルダ名は何でもいいですが、configにする場合が多いようです。

今回プロジェクト名は「get_test」という名前で設定しましたので、構造的には以下のようになっています。

.
└─get_test
   ├─get_test
   │  ├─__init__.py
   │  ├─settings.py
   │  ├─urls.py
   │  └─wsgi.py
   ├─templates
   ├─manage.py
   └─db.sqllite3

2階層目のget_testが設定フォルダですので、これを変更します。

.
└─get_test
   ├─config # ←変更した
   │  ├─__init__.py
   │  ├─settings.py
   │  ├─urls.py
   │  └─wsgi.py
   ├─templates
   ├─manage.py
   └─db.sqllite3

開発環境・本番環境用にファイルを分割する

次に、開発環境・本番環境で設定ファイルを読み替えられるようにします。

まず、先ほどリネームしたconfigの直下にsettingsというフォルダを作成します。

.
└─get_test
   ├─config
   │  ├─settings # ←作成
   │  ├─__init__.py
   │  ├─settings.py
   │  ├─urls.py
   │  └─wsgi.py
   ├─templates
   ├─manage.py
   └─db.sqllite3

さらにその中に、以下のファイルを作成します。

  • __init__.py : Python用のディレクトリであることを明示します。
  • base.py : テスト環境・本番環境に関係なく、共通で使用される設定を書き込むファイルです。
  • dev.py : 開発環境で使用される設定を書き込むファイルです。
  • production.py : 本番環境で使用される設定を書き込むファイルです。

この段階で、以下のような構造になります。

.
└─get_test
   ├─config
   │  ├─settings
   │  │  ├─__init__.py
   │  │  ├─base.py
   │  │  ├─dev.py
   │  │  └─production.py
   │  ├─__init__.py
   │  ├─settings.py
   │  ├─urls.py
   │  └─wsgi.py
   ├─templates
   ├─manage.py
   └─db.sqllite3

ここで、初期に生成されるsettings.pyの中身を全てbase.pyにコピペし、settings.pyを削除します。

次に、dev.pyを編集しましょう。
こちらのファイルでまず最初にbase.pyの中身を引き継ぐようにします。

from .base import *

あとは、開発環境と本番環境で変えたい設定を書き加えるだけです。
例えばDEBUGの設定や、データベースの設定STATICファイルの置き場所などがあげられますね。

最終的にはこんな感じになります。

from .base import *

DEBUG = True

if DEBUG:
    ALLOWED_HOSTS = ['127.0.0.1', 'localhost', ]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
        'OPTIONS': {
            'charset': 'utf8mb4'
        }
    }
}

同様に、本番環境のみで適用させたい設定はproduction.pyに書き込んでおきます。

それぞれの設定ファイルを読み込めるようにする

ここまでで、フォルダ名をリネームしたりファイルを分割したりと色々やってきましたが、当然このままでは動きませんので修正する必要があります。

まずはbase.pyを修正しましょう。
以下の箇所を修正します。

ROOT_URLCONF = 'get_test.urls'
↓
ROOT_URLCONF = 'config.urls'

~~~~~~~~~~~~~~~~~~~~~~~~~~~~

WSGI_APPLICATION = 'get_test.wsgi.application'
↓
WSGI_APPLICATION = 'config.application'

次に、manage.pyを修正します。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'get_test.settings')
↓
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.dev')

最後は、configの中にあるwsgi.pyです。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'get_test.settings')
↓
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production')

これで動くようになりました。
試しにmanage.pyコマンドを動かしてみて、問題なく動作すれば完了です!

本番環境で動かすときは引数をつける

開発環境であればこのままで大丈夫ですが、本番環境はまだ動きません。

manage.pyの修正を思い出してもらえればわかると思いますが、基本はdevを参照しています。
本番環境ではproductionを参照してほしいですから、引数を加えることでこの問題は解決します。

python manage.py migrate --settings get_test.settings.production

以上です!