虚無ありき

うるせーーーしらねーーー

開発中の Django の Session が切れる問題

tl;dr

  • Django の開発する際、コードを変更したら自動的にサーバがリロードされる
  • 以前まで、リロードされても Session が保たれていたため、再度ログインが必要なかった
  • setting.pySECRET_KEY を自動生成にしたら、リロードされる度に再度ログインが必要になった

以前まで

setting.pySECRET_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.pySECRET_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