【问题标题】:Pyramid beaker - is there a way to create an endpoint that doesn't update the session timestamp?金字塔烧杯 - 有没有办法创建一个不更新会话时间戳的端点?
【发布时间】:2015-11-21 12:54:30
【问题描述】:

在尝试在 30 秒不活动后在浏览器端实现自动注销时,我们考虑创建一个 /heartbeat 端点:

  • 当用户移动鼠标或键入任何键时,会在 10 秒后安排一个 javascript 回调,以调用 PUT /heartbeat
  • 如果已安排回调,则取消前一个回调 - 这样做是为了避免当用户连续键入和/或移动鼠标(例如写入内容时)时 PUT /heartbeat 的“雪崩”。
  • 然后,每 60 秒发出一个GET /heartbeat - 检查自上次“更新”该用户会话以来经过了多少时间。我们可以通过检查烧杯会话表的内容来做到这一点。如果超过 30 分钟,端点会向 Javascript 返回一个适当的指示,因此用户会自动在浏览器中注销。

这可以正常工作,除了一个小缺陷 - GET /heartbeat 更新烧杯会话时间戳...

所以,问题是 - 在 Pyramid/Beaker 下,有没有办法创建一个不更新会话时间戳的端点?

【问题讨论】:

  • 如果已经安排了回调,则取消前一个回调这样,如果用户连续执行某些操作,您将永远不会收到心跳...
  • @Piotr:如果用户正在做某事,那么后端会因为他的行为而被调用,所以他的会话保持活动状态。
  • (...) 这样做是为了避免在用户连续键入和/或移动鼠标时出现PUT /heartbeat 的“雪崩”用户只是在打字,更不用说移动鼠标了?
  • :-) 不,当然不是。关键是用户可能会做一些涉及后端的事情(这意味着烧杯/金字塔将标记会话并且它仍然存在)或者他可能正在我们的文档编辑器中编写(不调用后端,所以他的会话可能过期。心跳用于指示用户还活着,即使他还没有调用后端(还 - 保存他的更改)。现在有意义吗?如果他写/移动鼠标,10秒后心跳将被发送,保持会话活动。我们不希望在每次鼠标移动/击键时都这样做,因此会限制

标签: python pyramid beaker


【解决方案1】:

我最终所做的是创建了自己的BeakerSessionFactoryConfig,以及session_factory_from_settings(实例化BeakerSessionFactoryConfig)。

然后我修改了您在此处可以看到的内容(对self.persist() 的调用)https://github.com/Pylons/pyramid_beaker/blob/6a62134bf99ff8d0836ccc0f6be557b816fa9987/pyramid_beaker/init.py#L32,使其成为基于请求对象上是否设置了特定属性的条件操作。

这是可行的,因为只要不调用 .persists(),就不会在数据库(或您正在使用的任何其他存储)中更新会话“上次访问”时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2017-01-12
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多