【发布时间】: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 调用很容易绕过信号。