開発中の Django の Session が切れる問題
tl;dr
- Django の開発する際、コードを変更したら自動的にサーバがリロードされる
- 以前まで、リロードされても Session が保たれていたため、再度ログインが必要なかった
setting.py
のSECRET_KEY
を自動生成にしたら、リロードされる度に再度ログインが必要になった
以前まで
setting.py
の SECRET_KEY
にハードコーディングしたり、env file から読み込んだりしていた。
SECRET_KEY = "a)4r0@mbs6&yef62h2b4(h&b37f$ijn9t53t=hg5wk0_s"
import os SECRET_KEY = os.environ.get("SECRET_KEY")
ただ、これだとデプロイの度に setting.py
を書き換えたり、env file を書き換えるのが辛いと感じていた。
何をしてだめになったか
setting.py
の SECRET_KEY
を自動生成にした。
import random import string def generate_secret_key(n): c = string.ascii_lowercase + string.ascii_uppercase + string.digits return "".join([random.choice(c) for i in range(n)]) SECRET_KEY = generate_secret_key(32)
この場合、自動的にサーバがリロードされる度に SECRET_KEY が生成されるようになる。
Django Docs - settings より、SECRET_KEY
の役割としては以下の通りで、SECRET_KEY
が変わると Session が切れる。
- All sessions if you are using any other session backend than django.contrib.sessions.backends.cache, or are using the default get_session_auth_hash().
- All messages if you are using CookieStorage or FallbackStorage.
- All PasswordResetView tokens.
- Any usage of cryptographic signing, unless a different key is provided.
どうすればいいか
デプロイの際に local_settings.py
などに書き込むようにして、そこから読み込むようにすれば良い。local_settings.py
を git 監視下から外す。
以下のようなスクリプトを作成し、entry_point.sh などで実行するようにする
from django.core.management.utils import get_random_secret_key print('SECRET_KEY = "{}"'.format(get_random_secret_key()))
python generate_secretkey.py > local_settings.py
setting.py
の中で import する
import settings_local
SECRET_KEY = settings_local.SECRET_KEY