Tornado,Django,Websockets和Session同步

时间:2014-04-04 22:19:03

标签: django session cookies websocket tornado

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

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

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

直到现在还可以:Websockets连接,只发送一次cookie,该套接字的服务器端绑定可以具有该cookie值(会话ID)并使用它直到连接关闭。< / p>

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

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

1 个答案:

答案 0 :(得分:1)

我假设你正在使用django的cookie系统(使用django.contrib.sessions.middleware.SessionMiddleware)。

您显然不希望每个websocket请求中的每个会话cookie。然后由服务器决定会话是否还活着。

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

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