【问题标题】:can a single instance of websocket[tornado] to handle different requests?websocket[tornado] 的单个实例可以处理不同的请求吗?
【发布时间】:2015-01-12 14:24:06
【问题描述】:

我从事一个使用 Ajax 和 Websockets 的项目。任务是摆脱 Ajax 并仅使用 Websockets。在服务器端,我将 tornado 和 django 与 tornado-url-dispatcher 一起使用。我想使用 websocket(tornado.websocket.WebSocketHandler) 的单个实例重用 django 中已经定义的一些方法。这个类有 3 个默认处理程序,但我通过添加新的处理程序来扩展它,这些处理程序重定向到现有的 django 方法并修改调度程序以指向新方法。

class WSHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        ...
    def on_message(self, message):
        ...
    def on_close(self):
        ...
    def new_handler_1(self, request):
        ...

tornado_app = tornado.web.Application(
    [
      (r'/ws/new_handler', wshandler.WSHandler.new_handler_1),
      (r'/ws', wshandler.WSHandler),
    ]

我应该使用什么类型的响应来从 new_handler_1 方法回复通过 websocket 完成的请求?谢谢。

【问题讨论】:

    标签: django websocket tornado


    【解决方案1】:

    你不能这样做;为每个请求创建处理程序类的新实例。相反,创建一些其他共享对象,处理程序可以使用它们在它们之间进行通信。您可以通过将此对象附加到 Application 对象或将其作为 initialize 参数传递给处理程序来将此对象传递给处理程序。

    【讨论】:

    • 嗨!什么是共享对象,您能否详细说明如何执行此操作?指向源代码或代码 sn-p 的链接也会有所帮助。谢谢。
    • 我只是指您在启动时创建并存储在所有实例都可以访问的某个位置的一些对象。这可以像一个全局变量一样简单,比如github.com/tornadoweb/tornado/blob/stable/demos/chat/…中的MessageBuffer@
    • 你可以放任何东西;我通常建议放置一个回调对象而不是 WSHandler 本身(这样您就可以支持混合使用 websocket/long-polling)。全局变量将是多个处理程序回调的容器。
    • 如何混合它们?对于评论线程来说,这个话题太宽泛了。 Tornado 的演示目录有两个单独的聊天演示版本,一个用于长轮询,一个用于 websockets,但可以将两者结合起来。只需确保 MessageBuffer(或等效的)处理抽象回调,而不是直接调用 write_message 之类的方法。
    • 是的,您可以将常规的 RequestHandler 用于客户端到服务器,将 websockets 用于服务器到客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2023-03-27
    • 1970-01-01
    • 2014-01-13
    • 2012-10-24
    相关资源
    最近更新 更多