痛風とシステム障害を恐れるエンジニアのブログ

趣味のことだったり仕事に関することだったりを徒然なるままに。webとかオープン系の会社で働いてます。お仕事の依頼お待ちしておりまーす。

Djangoの設定ファイルの読み込みを実行環境ごとに分けてみる

ローカルの開発環境と本番の実行環境とでDjangoを動かすときに、データベースの設定やDEBUGフラグの設定など、都度都度切り替えるのもめんどくさいので、なにかよい方法がないかと色々と試してみたのでその過程をメモっておきます。


いくつか環境の情報をあげておきます。
ローカルの環境は
MacOSX+Pycharm
本番環境は
CentOS6+Docker(Ubuntu)で、DockerのUbuntu上でGunicorn+Djangoで動かしています。

Djangoが読み込むsettings.pyは基本的には本番環境の設定を記載しています。
ローカル環境で実行するときはPycharmのterminalから

python manage.py runserver

を実行しています。

最初はこのコマンドの引数に

python manage.py runserver --mode=dev_local

という形で引数を与えてから実行しよとしたのですが、manage.pyは設定できるオプションに限りがあるようで断念。

色々と調べていくと、こちらで設定ファイルをオプションで指定できることがわかりました。
Django settings | Django documentation | Django

そこで私が考えた方法は
1.まずは本番の設定ファイルを読み込む。
2.引数に指定されている設定ファイルの内容を元に基本の設定ファイルの情報を上書き
という形で実装しようと思いました。

今回はローカルの開発環境なのでlocal_settings.pyというファイルを用意し

python manage.py runserver --settings=local_settings

というコマンドを指定することにしました。
これであれば、ステージング環境やちょっと設定ファイルが異なる環境を複数用意するのも簡単だからです。

local_settings.pyはこのように書いてます。

from my.settings import *

DEBUG = True

HOSTNAME = "{ローカルのホスト名}"

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'hoge',
          'USER':'hoge',
          'PASSWORD':'hoge',
          'HOST':'127.0.0.1',
    }
}

一点詰まったところがありました。

from my.settings import *

この部分。
PHPの感覚が影響して、import = requireという認識があったので最初は

from my import settings

とやっいて、この記述で settingsの中に記述されている変数は展開されると思ってたけど、実際はそうじゃなかったです(^_^;)
まだまだ勉強が足りませんな。



なお、こちらのサイトも参考にしました。
こちらのサイトのほうがおすすめされているようですね。i2bskn.hateblo.jp