我正在使用pyramid_sockjs构建金字塔应用程序。此应用程序需要对来自redis pub / sub或rabbitmq的传入消息做出反应。我应该在哪里插入逻辑来监听消息系统并通过向sockjs客户端发送消息来做出反应?
我找到了这个link for socket.io,我想对sockjs和Pyramid做同样的事情。
答案 0 :(得分:0)
假设您使用config.include('pyramd_sockjs')
后跟config.add_sockjs_route()
设置金字塔配置。这里的一般困难是弄清楚如何掌握应用程序当前的sockjs-sessions。我想到了三个场景:
pyramid_sockjs.session.Session
子类内的消息做出反应,如chat example所示。request.get_sockjs_manager().broadcast(some_message)
registry
所有插件都离开他们的痕迹。在视频的minute 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
通常为discouraged,因为您很难测试代码。它返回当前请求或全局注册表 - 金字塔的核心组成部分。__sockjs_managers__
pyramid_sockjs应该在注册表中为request
提供了一个getter。name
属性(将kw传递给add_sockjs_route
进行更改)遗憾的是,pyramid_sockjs并未提供"房间"但是,您的消息将被广播到所有连接的客户端,而无需任何先前的过滤机制。帮助您可能想要继承pyramid_sockjs.session.Session
和.SessionManager
。 (请告诉你,如果你这样做!)