金字塔烧杯 - 有没有办法创建一个不更新会话时间戳的端点?
Pyramid beaker - is there a way to create an endpoint that doesn't update the session timestamp?
为了尝试在 30 秒不活动后在浏览器端实现自动注销,我们考虑创建一个 /heartbeat
端点:
- 当用户移动鼠标或键入任意键时,将在 10 秒后安排 javascript 回调,以调用
PUT /heartbeat
。
- 如果已经安排了回调,则取消前一个回调 - 这样做是为了避免 "avalanche" 的
PUT /heartbeat
当用户键入 and/or 连续移动鼠标时(同时例如写内容)。
- 然后,每 60 秒发出一个
GET /heartbeat
- 检查自上次用户会话 'updated' 以来已经过去了多长时间。我们可以通过检查烧杯会话 table 的内容来做到这一点。如果超过 30 分钟,端点 returns 向 Javascript 发出适当的指示,因此用户会自动在浏览器中注销。
这会工作得很好,除了一个小缺陷 - GET /heartbeat
更新烧杯会话时间戳...
所以,问题是 - 在 Pyramid/Beaker 下,有没有办法创建一个不更新会话时间戳的端点?
我最终做的是创建了自己的 BeakerSessionFactoryConfig
,以及 session_factory_from_settings
(实例化 BeakerSessionFactoryConfig
)。
然后我修改了您在这里看到的内容(对 self.persist()
的调用)https://github.com/Pylons/pyramid_beaker/blob/6a62134bf99ff8d0836ccc0f6be557b816fa9987/pyramid_beaker/init.py#L32 使其成为基于是否在请求对象上设置了特定属性的条件操作。
这是有效的,因为只要不调用 .persists()
,会话 "last accessed" 时间戳就不会在数据库(或您正在使用的任何其他存储)中更新。
为了尝试在 30 秒不活动后在浏览器端实现自动注销,我们考虑创建一个 /heartbeat
端点:
- 当用户移动鼠标或键入任意键时,将在 10 秒后安排 javascript 回调,以调用
PUT /heartbeat
。 - 如果已经安排了回调,则取消前一个回调 - 这样做是为了避免 "avalanche" 的
PUT /heartbeat
当用户键入 and/or 连续移动鼠标时(同时例如写内容)。 - 然后,每 60 秒发出一个
GET /heartbeat
- 检查自上次用户会话 'updated' 以来已经过去了多长时间。我们可以通过检查烧杯会话 table 的内容来做到这一点。如果超过 30 分钟,端点 returns 向 Javascript 发出适当的指示,因此用户会自动在浏览器中注销。
这会工作得很好,除了一个小缺陷 - GET /heartbeat
更新烧杯会话时间戳...
所以,问题是 - 在 Pyramid/Beaker 下,有没有办法创建一个不更新会话时间戳的端点?
我最终做的是创建了自己的 BeakerSessionFactoryConfig
,以及 session_factory_from_settings
(实例化 BeakerSessionFactoryConfig
)。
然后我修改了您在这里看到的内容(对 self.persist()
的调用)https://github.com/Pylons/pyramid_beaker/blob/6a62134bf99ff8d0836ccc0f6be557b816fa9987/pyramid_beaker/init.py#L32 使其成为基于是否在请求对象上设置了特定属性的条件操作。
这是有效的,因为只要不调用 .persists()
,会话 "last accessed" 时间戳就不会在数据库(或您正在使用的任何其他存储)中更新。