Python 从Requesthandler调用Tornado WebSocketHandler

Python 从Requesthandler调用Tornado WebSocketHandler,python,websocket,tornado,requesthandler,Python,Websocket,Tornado,Requesthandler,我正在使用Tornado Webserver,并希望从RequestHandler内部调用WebSocketHandler 无法使用重定向/重定向处理程序功能,因为要调用的WebSocketHandler类(“以下示例中的IndexHandlerDynamic1”)将使用类工厂创建 使用Requesthandler()的定义,我的示例如下所示: class IndexHandlerDynamic1(tornado.web.WebSocketHandler): def initialize

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

无法使用重定向/重定向处理程序功能,因为要调用的WebSocketHandler类(“以下示例中的IndexHandlerDynamic1”)将使用类工厂创建

使用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))] 
        ) 
app=tornado.web.Application(
[(r/,IndexHandler)]+
[(r)/通道/(?P[^\/]+)?”,类工厂(通道ID))]
) 
如何使用channelId作为调用ClassFactory作为Requesthandler的参数


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

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

谢谢你有用的建议!我更新了我的问题,也许你可以给我一个如何解决它的提示。url的解析组件在调用RequestHandler.\u execute方法之前是不可用的,因此在构造处理程序实例时你将无法使用它们。您可以通过请求对象的属性访问原始url,并在工厂中自己解析它。太棒了!谢谢你的帮助。通过属性从原始url提取参数。