Djangoで期限切れセッションは削除しちゃおう
Djangoでセッションはdefaultでデータベースに保存されます。
ほっておくと、期限切れセッションが増えてきてしまうので、
削除する方法を紹介したいと思います。
試した環境
Django 3.0.5
Python 3.8.2
仕様の確認
仕様を確認すると、推奨するやり方が書いてあります。
Clearing the session store
Django does not provide automatic purging of expired sessions. Therefore, it’s your job to purge expired sessions on a regular basis. Django provides a clean-up management command for this purpose: clearsessions.
自動一掃はしないから、定期的に一掃するのはあなたの仕事ですよ。
でもコマンドは用意してるよって感じですね。
どうやら、clearsessions というコマンドあるみたいですね。
削除方法
manage.py があるディレクトリに行き、下記コマンドを打つだけです。
$ python manage.py clearsessions
これで、期限切れのセッションのみをデータベースから削除してくれるみたいです。
確認
DBのテーブル確認
セッションはdjango_sessionテーブルで確認できます。
現在2件のデータが入ってます。
sqlite> select session_key, expire_date from django_session;
3dub24wutcq28y7lhgnfl2rasoy37646|2020-07-11 19:20:40
g7s29wnv45boguo5np33yroq61t4v9c2|2020-07-25 13:50:10
expire_date は 2020-07-11 と 2020-07-25 です。
コマンドによる削除
現在の日付を確認して、セッションを削除します。
$ date
2020年 7月 12日 日曜日 23:00:36
$ python manage.py clearsessions
テーブルを確認してみましょう。
sqlite> select session_key, expire_date from django_session;
g7s29wnv45boguo5np33yroq61t4v9c2|2020-07-25 13:50:10
1件のみになりました。
2020-7-12 23:00:36 時点で 2020-07-11 のセッションはexpireしてるので、削除されました。
ご参考までに
実際にコマンドのソースコードを確認してみましょう。
clearsessionsのソース
class SessionStore(SessionBase):
...
@classmethod
def clear_expired(cls):
cls.get_model_class().objects.filter(expire_date__lt=timezone.now()).delete()
expire_date < timezone.now()
で現在時刻より前のデータを対象にしているのが、分かると思います。
##参考にしたサイト
https://stackoverflow.com/questions/7296159/django-session-database-table-cleanup