helloworlds

not a noun, it's a verb

【Python】Djangoのsettings.pyって2回読み込まれてる!!???

今回は、Djangoのプロジェクトでちょっとハマったことがメインです。 ※ 日本語の記事なくて、結果ですが断定して言えないのでご承知下さい!

経緯

Djangoのプロジェクトでローカル環境開発をしていました。 前回少し記事にしたやつですね。

o21o21.hatenablog.jp

こちらけっこうイジっていて、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回実行されていたのです。

なんだろうと思いながら調べてみると、以下の質問を発見。

stackoverflow.com

結果的に...

結果的にこの質問からすると、Djangoの起動時には、プロセスが2回別々で起動され、settings.pyが読み込まれてるらしい。 (ちょっと細かいことは調べてないです。。。)

なるほど〜、ここが大きく関係していそうだな〜

ということでした。

あんまりsettings.pyにはゴチャゴチャコード書かない方が良さそうでした。。

なので、settings.pyをちょっとファイル名を変更してもう1ファイル作成し、 起動時のsettings.py自体の読込を環境ごとに変更する方法を検討しようかと思います。

以上.