【问题标题】:Tornado, Django, Websockets, and Session syncingTornado、Django、Websockets 和会话同步
【发布时间】:2014-05-17 10:14:25
【问题描述】:

这是一个理论问题,因为我对这个概念只有一个概念,还没有任何代码。

假设我将 Websockets 与 Tornado 一起使用,并以桥接方式使用一个 django 项目来处理常规连接。这意味着:实际的服务器是 Tornado,它接收每个请求,如果请求没有 /socket 的路径(比如),django wsgi 处理程序将处理它(通过后备容器)。另一方面,对 /socket 路径的请求必须具有 ws 或 wss 协议,并被 Tornado 视为 websocket。

连接开始时,升级前的第一个请求会有cookies,我可以从cookies中获取会话ID,并使用会话管理器通过ID获取会话对象。对于该连接的失效,由于它是一个 websocket 连接,它将是一个长期的连接,我将具有相同的会话 id cookie 值(因为我无法获取 cookie 标头,因为 websocket 连接没有t 不再发送标头 - 想法是减少开销,并且通过消息传递 cookie 可能会产生巨大的开销)。

到目前为止一切正常:Websockets 连接,只发送一次 cookie,绑定到该套接字的服务器端可以拥有该 cookie 值(会话 id)并使用它直到连接关闭。

我的问题:如何实时检测会话不再可用? (可能的原因:1.用户发布了一个涉及关闭当前会话的资源,尽管它是通过 AJAX 完成的并且 websocket 没有关闭;2.会话由于空闲而过期;3.通过使用 django api 以某种方式关闭了会话,虽然这并不意味着当前的执行上下文是请求被关闭 - 我不知道这种情况是否可能)。

注意事项:检测特定会话何时关闭可以帮助我确定相应的 websocket 是否也必须关闭。

【问题讨论】:

    标签: django session cookies websocket tornado


    【解决方案1】:

    我假设您使用的是 django 的 cookie 系统(使用 django.contrib.sessions.middleware.SessionMiddleware)。

    您显然不希望每个 websocket 请求上的每个会话 cookie。然后由服务器来确定会话是否处于活动状态。

    这将需要始终访问会话存储。如果您使用数据库支持的会话,则会引入大量开销。如果您使用缓存支持的会话,这是可行的。

    来自 django 文档的参考:https://docs.djangoproject.com/en/1.8/topics/http/sessions/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2023-03-15
      相关资源
      最近更新 更多