我正在编写一个使用 Tornado websockets 的小应用程序。我使用 cookie 进行身份验证,因此我想在建立 Web 套接字时检查这一点。
所以这是挑战(基于官方 websockets 示例):
class EchoWebSocket(tornado.websocket.WebSocketHandler):
def open(self):
userx = self.get_secure_cookie("user")
if not userx:
self.send_error(403) #I want to redirect or otherwise stop the user
print "WebSocket opened"
def on_message(self, message):
userx = self.get_secure_cookie("user")
self.write_message(u"%s said: %s" % (userx, message))
def on_close(self):
print "WebSocket closed"
原来这在 Tornado 中不是很流行,抛出这个错误:
ERROR:root:Exception in callback <tornado.stack_context._StackContextWrapper object at 0x10fa10db8>
Traceback (most recent call last):
....
File "/Library/Python/2.7/site-packages/tornado-2.4-py2.7.egg/tornado/iostream.py", line 565, in _check_closed
raise IOError("Stream is closed")
IOError: Stream is closed
在 websockets 握手期间甚至可以“验证或取消”吗?这是我的代码有问题,还是 Tornado 有问题/缺少功能?在这种情况下,Tornado 是否能够通过 websockets 发送一些错误条件来触发客户端的 onerror 处理程序(在手册中找不到任何强制错误条件的方法)?
我试图实现的事件顺序是:
用户使用常规 Web 请求登录,会话令牌存储为安全 cookie
用户加载使用 websockets 的页面,javascript 尝试建立套接字
在建立套接字之前,我想检查是否存在有效的会话令牌
- 如果令牌有效,则建立套接字并且我的应用程序按预期工作
- 如果令牌无效,则没有套接字,并且用户收到错误消息(或者,服务器会引发 websocket 错误条件)