如何使用pyramid_sockjs进行消息传递?

时间:2013-04-24 13:44:01

标签: python redis rabbitmq pyramid gevent-socketio

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

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

1 个答案:

答案 0 :(得分:0)

假设您使用config.include('pyramd_sockjs')后跟config.add_sockjs_route()设置金字塔配置。这里的一般困难是弄清楚如何掌握应用程序当前的sockjs-sessions。我想到了三个场景:

  1. 通常会对您自己pyramid_sockjs.session.Session子类内的消息做出反应,如chat example所示。
  2. 通过调用request.get_sockjs_manager().broadcast(some_message)
  3. ,您可以在其中一个视图中广播消息
  4. 但是,如果您既不在sockjs-messaging中也不在http-request-cycle中,那么您必须诉诸金字塔registry所有插件都离开他们的痕迹。
  5. 在视频的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,因为您很难测试代码。它返回当前请求或全局注册表 - 金字塔的核心组成部分。
    • for __sockjs_managers__ pyramid_sockjs应该在注册表中为request提供了一个getter。
    • 空字符串是pyramid_sockjs'默认name属性(将kw传递给add_sockjs_route进行更改)

    遗憾的是,pyramid_sockjs并未提供"房间"但是,您的消息将被广播到所有连接的客户端,而无需任何先前的过滤机制。帮助您可能想要继承pyramid_sockjs.session.Session.SessionManager。 (请告诉你,如果你这样做!)