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

Python 如何强制Tornado WebSocket在握手时生成错误页面,python,websocket,tornado,Python,Websocket,Tornado,我正在编写一个小应用程序,我使用Tornado websockets。我使用cookies进行身份验证,因此我希望在建立web套接字时检查这一点 下面是基于官方websockets示例的挑战: class EchoWebSocket(tornado.websocket.WebSocketHandler): def open(self): userx = self.get_secure_cookie("user") if not userx:

我正在编写一个小应用程序,我使用Tornado websockets。我使用cookies进行身份验证,因此我希望在建立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

在WebSocket握手过程中,是否可以进行身份验证或取消?这是我的代码有问题吗,还是Tornado有问题/缺少功能?Tornado是否能够通过WebSocket发送一些错误条件,以触发客户端的onerror处理程序?在这种情况下,无法找到任何方法强制手册中的错误条件

我试图实现的事件顺序是:

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

用户加载一个使用WebSocket的页面,javascript尝试建立套接字

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

如果令牌有效,将建立套接字,我的应用程序将按预期工作 如果令牌无效,则不存在套接字,用户也会收到错误,服务器会引发websocket错误条件 是这个吗

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

是这样吗


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

看起来这个问题的答案就像Nikolay Fominyh建议的那样,尽管我不能接受这个答案,因为这是一个注释,而不是向用户发送消息和关闭连接的答案。这似乎是目前解决这个问题的最佳方法。

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

您可以跟踪您的用户,您可以轻松做到这一点,因为每个连接到服务器的用户都创建了一个实例,请选中此项

考虑到如果未对其进行身份验证,您希望关闭连接,您可以在WebSocketHandler实例中调用close方法,如下所示:

class WSHandler(tornado.websocket.WebSocketHandler):

def open(self):
    if not condition:
        self.close()
在Tornado中检查此项:Tornado.websocket.WebSocketHandler.WebSocketHandler.close


我没有亲自尝试过。您可以尝试一下,然后告诉我它是否适合您。

您可以跟踪您的用户,您可以轻松完成此操作,因为每个连接到服务器的用户都创建了一个实例,请选中此项

考虑到如果未对其进行身份验证,您希望关闭连接,您可以在WebSocketHandler实例中调用close方法,如下所示:

class WSHandler(tornado.websocket.WebSocketHandler):

def open(self):
    if not condition:
        self.close()
在Tornado中检查此项:Tornado.websocket.WebSocketHandler.WebSocketHandler.close


我没有亲自尝试过。您可以尝试一下,然后告诉我它是否适合您。

在WebSocket握手过程中是否可以进行身份验证或取消是的,但不是这样。向用户发送消息并关闭连接。足够公平。我想这应该很容易实现。在WebSocket握手过程中是否可以进行身份验证或取消是的,但不是这样。向用户发送消息并关闭连接。足够公平。我想这应该很容易实现。我几乎陷入了同样的境地,但我不确定我是否得到了尼古拉建议的答案。请您详细说明一下?我们应该发送什么消息来跟踪用户是否在websockets中经过身份验证?据我所知,只要您的客户端代码能够理解并相应地采取行动,您就会收到任何消息。我本以为在这之前有可能阻止WebSocket握手,但据我所知,这在龙卷风中似乎是不可能的。嗨,Invicutus,请检查我的答案。我几乎陷入了同样的境地,但我不确定我是否得到了尼古拉建议的答案。请您详细说明一下?我们应该发送什么消息来跟踪用户是否在websockets中经过身份验证?据我所知,只要您的客户端代码能够理解并相应地采取行动,您就会收到任何消息。我本以为在此之前有可能阻止WebSocket握手,但据我所知,龙卷风似乎不可能做到这一点。嗨,不可侵犯者,请检查我的答案。