Djangoのセッションエンジンを自作する方法

Djangoには、DB、ファイル、メモリなど、異なるバックエンドを持つセッションエンジンがあらかじめ用意されています。普通に使う分はこれで十分だと思われますが、環境次第ではそれらバックエンドが使用できない(or 適切でない)場合があり、その場合は自作する必要があります。※ 追記: 「Google App Engine/Pythonでセッションを使う方法」という、バックエンドをMemcacheにした場合の使い方を書いた記事を投稿しました。

まずは、自前セッションエンジンを実装するモジュールを用意し、そこに「django.contrib.sessions.backends.base.SessionBase」を継承した「SessionStore」クラスを定義します。次に、同クラスに、以下のオーバーライドしたメソッドを定義します。

  • exists(self, session_key)
  • create(self)
  • save(self, must_create=False)
  • delete(self, session_key=None)
  • load(self)

「exists」は引数に与えられた「session_key」に対するセッションが存在するかを判定するメソッドです。「create」はセッションキーの生成や、セッションの生成を行うメソッドです。「save」はセッションをバックエンドに保存するメソッドです。「delete」はバックエンドから該当のセッションを削除するメソッドです。「load」はバックエンドからセッションをロードするメソッドです。

上記メソッドの実装が終わったら、settings.pyの「SESSION_ENGINE」に、「SessionStore」クラスを定義したモジュールのパスを指定します。また、もし同設定ファイルの「MIDDLEWARE_CLASSES」に「django.contrib.sessions.middleware.SessionMiddleware」が設定されてなければ追加する必要があります。なお、settings.pyには、他にも以下のようなオプションが設定できます。(参考: Django | How to use sessions | Django documentation)

  • SESSION_COOKIE_AGE
  • SESSION_COOKIE_DOMAIN
  • SESSION_COOKIE_HTTPONLY
  • SESSION_COOKIE_NAME
  • SESSION_COOKIE_PATH
  • SESSION_COOKIE_SECURE
  • SESSION_EXPIRE_AT_BROWSER_CLOSE
  • SESSION_SAVE_EVERY_REQUEST
  • SECRET_KEY

あとは他のバックエンドと同様にセッションを利用することができます。

request.session["key"} = val  # Set key with a value.
val = request.session["key"]  # Raise a KeyError if key is not in the session.
val = request.session.get("key")  # Return None if key is not in the session.

この記事が役に立った場合、シェアしていただけると励みになります!!