websocket[tornado] 的单个实例可以处理不同的请求吗?

Posted

技术标签:

【中文标题】websocket[tornado] 的单个实例可以处理不同的请求吗?【英文标题】:can a single instance of websocket[tornado] to handle different requests? 【发布时间】: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 完成的请求?谢谢。

【问题讨论】:

【参考方案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 用于服务器到客户端。

以上是关于websocket[tornado] 的单个实例可以处理不同的请求吗?的主要内容,如果未能解决你的问题,请参考以下文章

Tornado-第三篇-tornado支持websocket协议

如何在 Tornado 中创建多个 websocket 聊天?

在 Tornado 中保留 websocket 连接列表 [重复]

tornado+websocket+mongodb实现在线视屏文字聊天

tornado 只能升级到 websocket 错误

使 Tornado websocket 处理程序线程安全