很抱歉在发布后的一个小时内回答了我自己的问题......但我想在下面得到这个想法。非常好奇是否有更好的方法,因为当我不得不求助于覆盖“下划线”方法并在流上编写低级消息时,它总是让我感到紧张......但似乎有效。
下面的处理程序在继续使用“_execute()”方法(检查 GET 请求并继续握手逻辑)之前检查身份验证。
import logging
import tornado.escape
import tornado.websocket
class AuthenticatedWebsocketHandler(tornado.websocket.WebSocketHandler):
'''Only allows a request to open a websocket for a valid current user.
This class assumes that the get_current_user() method is defined
to check for a valid session id. (see Tornado docs).
'''
def _execute(self, *args, **kwds):
if not self.current_user:
logging.warn('Unauthorized attempt by {} to open websocket.'
.format(self.request.remote_ip))
self.stream.write(tornado.escape.utf8(
'HTTP/1.1 401 Unauthorized\r\n\r\n'
'Not authenticated.'))
self.stream.close()
return
super(AuthenticatedWebsocketHandler, self)._execute(*args, **kwds)
_execute()
需要覆盖而不是与Tornadoinitialize()
扩展的结构tornado.web.RequestHandler
有关tornado.websocket.WebSocketHandler
。否则似乎没有一种优雅的方式来退出 IOloop 并提供适当的响应。