今回は、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自体の読込を環境ごとに変更する方法を検討しようかと思います。
以上.