LoginSignup
0
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-12

Djangoで期限切れセッションは削除しちゃおう:blush:

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()
で現在時刻より前のデータを対象にしているのが、分かると思います。

参考にしたサイト

0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4