清除浏览器历史记录后,在Django中的数据库支持的会话中删除会话数据

时间:2018-08-05 18:33:10

标签: python django web-frameworks django-sessions

清除浏览器历史记录后,将保留会话密钥和添加到表django_session(会话引擎由mysql数据库支持)中的数据,用于会话和后续请求添加了一个新的“会话密钥”。在用户经常清除其历史记录的情况下,此表将无意间增长。使用clearsessions命令不会删除行,因为尚未达到到期日期。如果到期日期很大,我该如何解决这个问题?是否有一些设置错误的设置?

1 个答案:

答案 0 :(得分:0)

实际上,有一种方法,但是效率很低,因为它需要遍历所有现有的Sessions。您可以使用信号捕获Session模型的post_save,然后删除该用户的所有现有Session(除了新会话之外)(我不确定这是否是您想要的,因为它将删除所有会话,而不仅仅是已清除的会话)。一个)。

from django.contrib.sessions.models import Session
from django.db.models.signals import post_save
from django.dispatch import receiver


@receiver(post_save, sender=Session)
def save_session(sender, instance, **kwargs):
    user_id = instance.get_decoded().get('_auth_user_id')
    # Get all sessions excluding current session
    sessions = Session.objects.exclude(session_key=instance.session_key)

    # Iterate over all sessions and decode them
    for session in sessions:
        session_user_id = session.get_decoded().get('_auth_user_id')
        # If the session belongs to user, delete it
        if session_user_id == user_id:
            session.delete()