如何强制Tornado websockets在握手时生成错误页面

时间:2012-11-12 21:28:17

标签: python websocket tornado

我正在编写一个小应用程序,我使用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处理程序(在手册中找不到任何强制错误条件的方法)?

我想要实现的一系列事件是:

  1. 用户使用常规Web请求登录,会话令牌存储为安全cookie

  2. 用户加载使用websockets的页面,javascript尝试建立套接字

  3. 在建立套接字之前
  4. 我想检查是否存在有效的会话令牌

    • 如果有效令牌,则建立套接字并且我的应用程序按预期工作
    • 如果无效令牌,则没有套接字,并且用户收到错误(或者,服务器引发websocket错误情况)

3 个答案:

答案 0 :(得分:3)

您可以跟踪您的用户,您可以轻松完成,因为每个用户连接到服务器时都会创建一个实例,请查看此SO link

关于你想要关闭连接,如果他没有经过身份验证,你可以通过在WebSWebSocketHandler实例中调用close()方法来实现它,如下所示:

class WSHandler(tornado.websocket.WebSocketHandler):

def open(self):
    if not condition:
        self.close()

在Tornado中查看此内容:tornado.websocket.WebSocketHandler.WebSocketHandler.close()

我自己没试过。您可以尝试并告诉我它是否适合您。

答案 1 :(得分:1)

这是吗?

http://www.tornadoweb.org/documentation/web.html#tornado.web.RequestHandler.write_error

您可以覆盖handle.write_error方法,但我不知道WebSocketHandler是否包含此方法

答案 2 :(得分:0)

看起来这个问题的答案就像Nikolay Fominyh所建议的那样(虽然我不能接受答案,因为它的评论而不是答案)向用户发送消息并关闭连接。目前这似乎是解决这个问题的最佳方法。