【问题标题】:How to trigger session deletion automatically after it expires?会话过期后如何自动触发删除?
【发布时间】:2019-08-05 10:53:27
【问题描述】:

我需要从数据库中删除过期的会话。

类似的 Stack Overflow 线程似乎建议引入计划任务(cron、Celery 等)来检查过期会话并删除它们。

但是,我想避免为这种简单的任务引入繁重的堆栈,并正在寻找一种“本机”方法,以便在会话过期时尽快从数据库中删除会话。

所以我在Session 模型上设置了一个pre_delete 信号,如果模型的实例过期,就会触发删除。但是还剩下一步:我需要 Django 在实例到期后立即在实例上运行delete

理想情况下,我需要像

这样的方法

request.session.on_expiry(some_function_that_deletes_a_session_from_db).

有没有办法做到这一点?

【问题讨论】:

  • 过期的会话不是事件。 Django 只是将该日期时间存储在数据库中(如expire_date),因此它永远不会触发某些事情。服务器可以闲置几天。这就是为什么计划任务通常是一种好方法的原因,尤其是因为它会“批量”删除会话数据,因此效率更高。
  • 另外,cron 不是“重堆栈”。您的系统已经支持 cron 作业;您需要做的就是将其配置为定期触发 clearsessions 任务。
  • @Willem Van Onsem:谢谢。我的用例是我还在当前会话名称下的媒体根目录中创建文件夹,其中存储了一些音频文件。因此,立即删除会话背后的基本原理是防止那些不再需要占用服务器空间的文件夹。
  • @barciewicz:此类触发器的问题在于,如果我们创建此类触发器,然后重新启动服务器,通常会删除“注册函数”,从而导致系统失败。此外,使用信号通常不是一个好主意(它应该作为最后的手段使用),因为许多 ORM 调用很容易绕过信号。

标签: python django


【解决方案1】:

所以我在Session 模型上设置了一个pre_delete 信号,如果模型的实例过期,就会触发删除。但是还剩下一步:我需要 Django 在实例过期后立即对其运行删除。

我并没有真正关注这有什么不同。如果pre_delete 信号被触发,这意味着Django 将删除Session 对象,所以如果我理解它,在pre_delete 信号中删除它只会导致错误。此外,信号很有用,但有几种方法可以通过 ORM 调用“绕过”信号。所以通常只有在其他方法都失败的情况下才应该使用信号。

清理过期会话时,删除是批量完成的,通常它不会运行查询。因此,最好只编写一个管理命令来经常检查哪些数据属于不再存在的会话。

理想情况下,我需要一个类似的方法

request.session.on_expiry(some_function_that_deletes_a_session_from_db).

Django 框架不会“主动”查看会话是否过期,它只是在需要该会话时检查会话是否过期。过期时没有触发器。

您可以自己实现此类触发器,例如,每次创建/更新会话时,添加某种异步函数,该函数将在达到到期日期时运行。但这会导致大量的记账,此外,如果服务器重新启动并且您没有以持久的方式实现这些功能,这些触发器将不再存在。

事实上,您根本不需要引入大量堆栈,它已经在那里。确实:Django 有一个request.session.clear_expired [Django-doc] 函数,你可以调用它来清除过期的会话。此外,它还构建了一个 clearsessions 方法,它是一个 managmenet 命令,因此如果您启用了 django.contrib.sessions 应用程序,那么您可以使用 management command named clearsessions [Django-doc] 运行:

manage.py <b>clearsessions</b>

此外,批量删除会话通常比一次删除一个单独的会话更好,因为数据库的负载会更低。如果您想减少过期会话的数量,可以经常运行此命令。

您可以轻松write a custom management command [Django-doc]。这更加健壮,因为如果服务器重新启动,它仍然可以主动查找此类文件,也很容易配置它的运行频率,而且通过批量执行此操作可能会更有效。

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2017-03-16
    • 2022-11-10
    • 2011-11-22
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多