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

Python 清除浏览器历史记录后,删除django中数据库支持的会话中的会话数据,python,django,web-frameworks,django-sessions,Python,Django,Web Frameworks,Django Sessions,清除浏览器历史记录后,会话的会话密钥和添加到表django_session(会话引擎是mysql支持的数据库)中的数据将保留,对于后续请求,将添加新的“会话密钥”。在用户经常清除其历史记录的情况下,此表将在不经意间增长。使用clearsessions命令不会删除行,因为尚未达到到期日期。如果到期日很长,我如何克服这个问题?是否存在设置错误的情况 实际上,有一种方法效率很低,因为它需要迭代所有现有会话。您可以使用信号捕获会话模型的post_save,然后删除此用户的所有现有会话(新会话除外)(我不

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

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


你不能。Django无法知道用户已删除其会话密钥。您只需等到到期日。用户将无法从多个设备登录。@zahlen,正如我所说,它会清除除新会话之外的所有会话。因此,是的,用户将无法从多个设备登录。基本上,没有其他办法。
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()