1

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

无法使用重定向 /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 

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

编辑:

感谢本的帮助!

可悲的是,我仍然无法将用户路由到名为 url 参数的动态创建的类。我希望您可以通过查看我的示例来理解我的问题:

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

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

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

4

1 回答 1

0

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

于 2014-07-30T19:02:12.030 回答