Djangoで期限切れセッション情報を削除する方法

Djangoで期限切れセッション情報を削除する方法をご紹介します。

条件

  • Django 2.1.7
  • Python 3.7.0

Djangoの期限切れセッション情報

Djangoでセッションを使用する場合、セッション情報が消されずに残ってしまう場合があります。

具体的には以下のようなケースです。

  • ユーザがDjangoのWebサイトにログインして、しばらく時間が経過しセッションタイムアウトになった。

ユーザが明示的にログアウト処理を行えば、セッション情報は削除されますが、セッションタイムアウトになった場合、そのセッション情報は残り続けます。
すなわち、DBでセッション情報を管理していた場合、DBにレコードが増え続け、ファイルでセッション情報を管理していた場合、セッションファイルが増え続けることになります。

Djangoでは自動で期限切れセッション情報を削除する機能は無いため、管理者が削除する必要があります。

DBでセッションを管理する場合

以下のテーブルに期限切れセッション情報が蓄積されていきます。

  • django_session

期限切れセッション情報の削除方法

以下のコマンドを実行することで、期限切れセッション情報をすべて削除することが出来ます。

python manage.py clearsessions

cronによる定期的な削除

cronの日次ジョブとして期限切れセッション情報を削除するのがお勧めです。

shell作成

対象Djangoプロジェクトのmanage.pyが存在するディレクトリに、期限切れセッション情報を削除するshellを作成します。

$ cd /home/user/django/mysite
$ vi purge_sessions.sh

shellの内容

#!/bin/bash

cd /home/user/django/mysite
# /usr/bin/python manage.py clearsessions # python 2.Xを使用する場合
/usr/bin/python3 manage.py clearsessions

shell実行権限設定

$ chmod 755 purge_sessions.sh

cron設定

$ cd /etc/cron.d
$ sudo vi purge_sessions
# m h dom mon dow user  command
# 毎日1:30に実行する
30 1  * * *   user /bin/bash /home/user/django/mysite/purge_sessions.sh

設定反映

cronの再起動を行います。

$ sudo service cron restart

参考

Django公式:Clearing the session store

https://docs.djangoproject.com/en/2.2/topics/http/sessions/#clearing-the-session-store

stackoverflow

https://stackoverflow.com/questions/7296159/django-session-database-table-cleanup

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です