如何将参数传递给 Tornado 的 WebSocketHandler class?

How to pass arguments to Tornado's WebSocketHandler class?

我试图在 Tornado 中初始化 WebSocketHandler 实例时将 my_object 的实例作为参数传递,因此我可以在通信期间使用它。我已尝试执行以下操作但没有成功。

class WSWebHandler(tornado.websocket.WebSocketHandler):
    def __init__(self, my_object):
        super(tornado.websocket.WebSocketHandler, self).__init__()
        self.my_object = my_object

    def open(self):
        print('new connection')

    def on_message(self, message):
        print('message received: %s' % message)

    def on_close(self):
        print('connection closed')

    def check_origin(self, origin):
        return True

my_object = new My_Object()

application = tornado.web.Application([(r'/ws', WSWebHandler), my_object])
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8080)
myIP = socket.gethostbyname(socket.gethostname())
print ('*** Websocket Server Started at %s***' % myIP)
tornado.ioloop.IOLoop.instance().start()

有没有猜错的地方?

提前致谢

1.传递局部参数

Tornado 提供了一种不同的机制来将参数传递给处理程序。在您的处理程序 class 中创建一个名为 initialize 的方法。 Tornado 将使用您的自定义参数自动调用此方法:

class WSWebHandler(tornado.websocket.WebSocketHandler):
    def initialize(self, my_object):
        self.my_object = my_object

您还错误地传递了参数。正确的做法是:

tornado.web.Application(
    [
        (r'/ws', WSWebHandler, {'my_object': my_object}),
       # \____/  \__________/  \______________________/
       #   url      handler       dict of extra args

    ],
)

2。从 URL

传递参数

以上代码用于传递局部参数。您还可以将动态参数从 URL 传递到 websocket 处理程序,如下所示:

tornado.web.Application(
    [
        (r'/ws/(?P<id>[0-9])', WSWebHandler),
    ],
)

# Now the websocket handler's `open` method will accept 
# a parameter called `id`
class WSWebHandler(tornado.websocket.WebSocketHandler):
    def open(self, id):
        # do something with id
        pass