2

我正在使用pyramid_sockjs构建一个 Pyramid 应用程序。这个应用程序需要对来自 redis pub/sub 或 rabbitmq 的传入消息做出反应。我应该在哪里插入逻辑来监听消息系统并通过向 sockjs 客户端发送消息来做出反应?

我找到了 socket.io 的这个链接,我想对 sockjs 和 Pyramid 做同样的事情。

4

1 回答 1

0

假设您设置了一个金字塔配置,config.include('pyramd_sockjs')后跟config.add_sockjs_route(). 这里的一般困难是弄清楚如何获取应用程序当前的 sockjs-sessions。我在考虑三种情况:

  1. 通常你会对来自你自己的子类中的消息做出反应,pyramid_sockjs.session.Session聊天示例所示。
  2. 从您的一个视图中广播消息就像调用一样简单request.get_sockjs_manager().broadcast(some_message)
  3. 但是,如果您既不在 sockjs-messaging- 也不在 http-request-cycle 中,那么您必须求助于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.
  • 空字符串是 pyramid_sockjs 的默认name属性(传递为 kwadd_sockjs_route以更改它)

不幸的是,pyramid_sockjs 还没有提供“房间”,因此您的消息将被广播到所有连接的客户端,而无需任何先前的过滤机制。以帮助您可能想要子类化pyramid_sockjs.session.Sessionand .SessionManager。(如果你这样做,请告诉!)

于 2014-10-06T15:01:31.103 回答