【问题标题】:How to trigger an action on session timeout in Django如何在 Django 中触发会话超时操作
【发布时间】:2015-01-24 13:57:25
【问题描述】:

我想知道如何在会话超时发生时触发操作。有没有办法设置在会话数据被销毁之前执行的回调函数?我需要一个也适用于未经身份验证的用户的解决方案。

【问题讨论】:

    标签: django session


    【解决方案1】:

    假设您使用的是默认会话数据库后端,您可以使用 Django 信号来检测何时从数据库中删除会话,方法类似于:

    Django - detect session start and end

    请注意,在 Django 1.5+ 中,要使用的命令是 clearsessions,而不是清理。

    更多细节可以参考clearing the session store的官方文档。

    如果 cronjob 配置在您的情况下不可行,您还可以通过执行以下操作清除其中一个视图中的会话存储:

    from django.core import management
    management.call_command('clearsessions')
    

    【讨论】:

    • 问题是我对清理Session 表不感兴趣。如文档中所述,这可以通过 cron 作业来完成。我想要做的是有一个触发器,每当会话s 到达s.expire_date - timezone.now() < 0 的位置时,它就会被激活。遗憾的是,它似乎并没有我想象的那么简单,所以我想我会执行一个 Celery 任务,它每 2 分钟检查一次 Session.objects.filter(expire_data__lt=timezone.now()) 是否返回一些东西,然后处理数据并最终生成一个 clearsessions
    • 在 Session 模型上使用 pre_delete 信号让您可以立即对执行显式注销的用户采取行动(甚至无需等待两分钟)。使用 cron 作业(甚至使用 Celery 任务)清除会话存储可以让您删除未明确注销(例如关闭浏览器)的用户的过期会话对象,再次激活 pre_delete 信号。
    • 我很想知道那些已经过期但没有被用户注销明确删除的会话。因此,编写一个同时执行两者(过滤过期会话、处理数据和清理表)的 Celery 任务更容易维护恕我直言。我的意思是,除非我要求,否则pre_delete 不会被触发。
    • 好的。现在我明白你的意思了。我认为定期检查会话存储的 celery 任务是最好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多