Tornado、Django、Websockets 和会话同步

5

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

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

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

到目前为止没问题:Websockets连接,仅发送一次cookie,该套接字的服务器端绑定可以具有该cookie值(会话ID)并在连接关闭之前使用它。

我的问题:如何实时检测会话不再可用? (可能的原因:1.用户发出涉及关闭当前会话的资源,尽管它是通过AJAX完成的,但WebSocket未关闭; 2.由于空闲时间过长而导致会话过期; 3.以某种方式通过使用Django API关闭会话,尽管这并不意味着当前执行上下文是正在关闭的请求-我甚至不知道是否可能出现这样的场景)。

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

1个回答

1
我假设您正在使用Django的cookie系统(使用django.contrib.sessions.middleware.SessionMiddleware)。显然,您不希望在每个WebSocket请求中都读取会话cookie。然后服务器需要找出会话是否仍在有效期内。这将需要一直访问会话存储。如果您使用数据库支持的会话,则会引入大量开销。如果您使用缓存支持的会话,则可以实现。来自Django文档的参考:https://docs.djangoproject.com/en/1.8/topics/http/sessions/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接