我正在使用Tornado Webserver,并希望从requestthandler内部调用WebSocketHandler。
不可能使用redirect/redirectHandler功能,因为要调用的WebSocketHandler类(下例中为"IndexHandlerDynamic1")将使用classFactory创建。
使用Requesthandler的定义(这里),我的例子看起来像:class IndexHandlerDynamic1(tornado.web.WebSocketHandler):
def initialize(self):
print "Forwarded to Websocket"
def open(self):
print "WebSocket opened"
class IndexHandlerDistributor(tornado.web.RequestHandler):
def get(self, channelId):
IndexHandlerDynamic1(self.application, self.request)
如果我请求相关的url,他跳到IndexHandlerDistributor和IndexHandlerDynamic1.initialize()被调用。
但是在客户端,浏览器控制台输出以下错误:
Error during WebSocket handshake: Unexpected response code: 200
显然socket连接没有正确打开,我的错误是什么?
编辑:感谢Ben的帮助!
遗憾的是,我仍然有麻烦将用户路由到一个动态创建的类命名为url参数。我希望你能通过看我的例子来理解我的问题:
app = tornado.web.Application(
[(r"/", IndexHandler)] +
[(r"/channel/(?P<channelId>[^/]+)?", ClassFactory(channelId))]
)
如何使用channelId作为我调用ClassFactory作为请求处理程序的参数?
或者是否有其他方法可以在应用程序运行时动态更改应用程序的路由?如果是这样的话,我可以用这种方法来解决我最初的任务。
问题是您将两个requesthandler附加到同一个请求。我不确定动态创建处理程序类是一个好主意,但如果你想这样做,只需传递你的工厂函数(它本身不是一个RequestHandler)到url路由表。路由表不一定需要RequestHandler子类,它只需要一个可以用(app, request)
调用并返回RequestHandler实例的对象。