如何在服务器端发出SocketIO事件



我正在运行一个getevent -socketio Django应用程序。

我有一个类似的类

@namespace('/connect')
class ConnectNamespace(BaseNamespace):
    def on_send(self, data):
        # ...

然而,如果我从javascript客户端接收事件,一切工作,例如send事件被正确处理

如果我想在服务器端emit一些事件,我有点迷路了。我可以在类中使用socket.send_packet

但是现在我想把一些事件链接到post_save信号,所以我想从这个命名空间类之外的send_packet,这样做的一种方法是

ConnectNamespaceInstance.on_third_event('someeventname')

我只是不知道如何才能得到ConnectNamespaceInstance的实例

总结一下,我只是想发送一个事件到javascript客户端后,我收到post_save信号

您可能想要做的是添加一个模块变量来跟踪连接,例如_connections,如下所示:

_connections = {}
@namespace('/connect')
class ConnectNamespace(BaseNamespace):

,然后添加initializedisconnect方法,这些方法使用一些可以稍后引用的快乐标识符:

def initialize(self, *args, **kwargs):
    _connections[id(self)] = self
    super(ConnectNamespace, self).initialize(*args, **kwargs)
def disconnect(self, *args, **kwargs):
    del _connections[id(self)]
    super(ConnectNamespace, self).disconnect(*args, **kwargs)

当您需要生成事件时,您可以在_connections变量中查找正确的连接,并使用emit触发事件。

(没有测试这些,但我在许多其他语言中使用过类似的模式:没有任何理由认为这在Python中不能正常工作)。

除了Femi的答案,我认为这当然有效。使用Redis可能会给你更多的灵活性,使用gevent的greenlet可能会使这种方法更符合"在框架内",因为你已经在使用geevent -socketio:D

REDIS_HOST = getattr(settings, 'REDIS_HOST', '127.0.0.1')

class YourNamespace(BaseNamespace):
    def _listener(self, channel_label_you_later_call_in_post_save):
        pubsub = redis.StrictRedis(REDIS_HOST).pubsub()
        pubsub.subscribe(chan)
        while True:
            for i in pubsub.listen():
                self.send({'message_data': i}, json=True) 
    def recv_message(self, message):
        if is_message_to_subscribe(message):
            self.spawn(self.listener, get_your_channel_label(message))

在postrongave中,你可以写

red = redis.StrictRedis(REDIS_HOST)
red.publish(channel_label, message_data)

相关内容

  • 没有找到相关文章

最新更新