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