如何发出的服务器端SocketIO事件(How to emit SocketIO event on

2019-08-17 19:51发布

我运行一个GEVENT-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信号

Answer 1:

你可能想要做的就是添加一个模块变量来跟踪联系,说_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工作,以及)。



Answer 2:

其他然后费米的答案,我认为肯定的作品。 使用Redis的可能会给你更多的灵活性和使用来自GEVENT greenlet可以多个“框架”,因为你已经在使用GEVENT-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))

而在你post_save,你可以做

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


文章来源: How to emit SocketIO event on the serverside