从Requesthandler调用Tornado WebSocketHandler

时间:2014-07-29 15:30:29

标签: python websocket tornado requesthandler

我正在使用Tornado Webserver,并希望从RequestHandler内部调用WebSocketHandler。

无法使用redirect / redirectHandler功能,因为将使用classFactory创建要调用的WebSocketHandler类(" IndexHandlerDynamic1"在下面的示例中)。

使用Requesthandler(here)的定义,我的例子如下:

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)

如果我请求相关网址,他会跳转到IndexHandlerDistributor并调用IndexHandlerDynamic1.initialize()。

但是在Clientside上,浏览器控制台输出以下错误:

Error during WebSocket handshake: Unexpected response code: 200 

显然套接字连接没有正确打开,我的错误是什么?

编辑:

感谢Ben的帮助!

遗憾的是,我仍然无法将用户路由到一个名为url参数的动态创建的类。我希望你能通过看看我的例子来理解我的问题:

app = tornado.web.Application( 
        [(r"/", IndexHandler)] + 
        [(r"/channel/(?P<channelId>[^\/]+)?", ClassFactory(channelId))] 
        ) 

如何使用channelId作为我调用ClassFactory作为Requesthandler的参数?

或者是否有其他方法可以在应用程序运行时动态更改应用程序的路由?如果是这样,我可以用这种方式解决我的初始任务。

1 个答案:

答案 0 :(得分:0)

问题是您要将两个RequestHandler连接到同一个请求。我不确定动态创建处理程序类是一个好主意,但是如果你想这样做只是将你的工厂函数(它本身不是RequestHandler)传递给url路由表。路由表不一定需要RequestHandler子类,它只需要一个可以用(app, request)调用的对象并返回一个RequestHandler实例。