我正在使用pyramid_sockjs构建一个 Pyramid 应用程序。这个应用程序需要对来自 redis pub/sub 或 rabbitmq 的传入消息做出反应。我应该在哪里插入逻辑来监听消息系统并通过向 sockjs 客户端发送消息来做出反应?
我找到了 socket.io 的这个链接,我想对 sockjs 和 Pyramid 做同样的事情。
我正在使用pyramid_sockjs构建一个 Pyramid 应用程序。这个应用程序需要对来自 redis pub/sub 或 rabbitmq 的传入消息做出反应。我应该在哪里插入逻辑来监听消息系统并通过向 sockjs 客户端发送消息来做出反应?
我找到了 socket.io 的这个链接,我想对 sockjs 和 Pyramid 做同样的事情。
假设您设置了一个金字塔配置,config.include('pyramd_sockjs')
后跟config.add_sockjs_route()
. 这里的一般困难是弄清楚如何获取应用程序当前的 sockjs-sessions。我在考虑三种情况:
pyramid_sockjs.session.Session
如聊天示例所示。request.get_sockjs_manager().broadcast(some_message)
registry
所有插件都会留下痕迹的金字塔。在视频的第 5 分钟,您会写出这样的内容:
def listener():
r = redis.Redis()
r.subscribe(['foo'])
for msg in r.listen():
from pyramid.threadlocal import get_current_registry
get_current_registry().__sockjs_managers__[''].broadcast(msg)
解释上述黑客:
get_current_registry
通常不鼓励使用,因为很难测试您的代码。它返回当前请求的或全局注册表——金字塔的中心核心组件。__sockjs_managers__
pyramid_sockjs 应该像为request
.name
属性(传递为 kwadd_sockjs_route
以更改它)不幸的是,pyramid_sockjs 还没有提供“房间”,因此您的消息将被广播到所有连接的客户端,而无需任何先前的过滤机制。以帮助您可能想要子类化pyramid_sockjs.session.Session
and .SessionManager
。(如果你这样做,请告诉!)