【问题标题】:How to pass arguments to Tornado's WebSocketHandler class?如何将参数传递给 Tornado 的 WebSocketHandler 类?
【发布时间】:2018-04-03 10:30:49
【问题描述】:

在 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()

你猜我哪里错了吗?

提前致谢

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    1.传递本地参数

    Tornado 提供了一种不同的机制来将参数传递给处理程序。在您的处理程序类中创建一个名为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
    

    【讨论】:

    • 哇,python 让参数传递变得复杂了。至少打好基础的好答案
    • @javadba 与 Python 无关。这就是框架的设计方式。您也可以直接从 url 传递动态参数,例如:r'/ws/(?P&lt;id&gt;[0-9])/'。现在 websocket 处理程序的 open 方法将接受 URL 中提供的名为 id 的参数。我已经用示例代码更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2019-07-17
    • 2013-02-12
    相关资源
    最近更新 更多