【Python】Djangoのsettings.pyって2回読み込まれてる!!???
今回は、Djangoのプロジェクトでちょっとハマったことがメインです。 ※ 日本語の記事なくて、結果ですが断定して言えないのでご承知下さい!
経緯
Djangoのプロジェクトでローカル環境開発をしていました。 前回少し記事にしたやつですね。
こちらけっこうイジっていて、DBの設定を見直していたところ、 環境毎の切り替えが必要やん!って思って調べていました。
できるだけプロジェクト構成はシンプルにしたいので、settings.py内で収めようとしました。
環境変数を使用して、環境ごとにDBの設定を変更しようと、以下のようなかんじになりました。
SET_DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxx',
'USER': 'xxxx',
'PASSWORD': 'pwd',
'HOST': 'db',
'PORT': 3306,
},
'staging': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxx',
'USER': 'xxxx',
'PASSWORD': 'pwd',
'HOST': 'db',
'PORT': 3306,
}
}
env = os.environ.get('DJANGO_ENV', 'default')
print('Running on "{}".'.format(env))
if env in SET_DATABASES:
DATABASES = SET_DATABASES[env]
else:
print('ERROR: Unknown environment for database settings.')
ちょっとif文があるけど、まあこれくらいならいいかと思い、そのままdocker-compose upで立ち上げ。
するとそんなすんなりいきませんでした。
エラー
...略...
if self._databases[DEFAULT_DB_ALIAS] == {}:
KeyError: 'default'
...略...
django.db.utils.ConnectionDoesNotExist: The connection default doesn't exist
ん、なんかdefaultがないって言われている... でもdefaultも記述してあるなあ〜と思ってログを見てみました。
そしたらなんかsettings.pyが2回読み込まれてる疑惑が浮上。
ログのなかでprintしている内容が2回実行されていたのです。
なんだろうと思いながら調べてみると、以下の質問を発見。
結果的に...
結果的にこの質問からすると、Djangoの起動時には、プロセスが2回別々で起動され、settings.pyが読み込まれてるらしい。 (ちょっと細かいことは調べてないです。。。)
なるほど〜、ここが大きく関係していそうだな〜
ということでした。
あんまりsettings.pyにはゴチャゴチャコード書かない方が良さそうでした。。
なので、settings.pyをちょっとファイル名を変更してもう1ファイル作成し、 起動時のsettings.py自体の読込を環境ごとに変更する方法を検討しようかと思います。
以上.