如何在serversid上发出SocketIO事件

2024-09-27 20:17:11 发布

您现在位置:Python中文网/ 问答频道 /正文

Geango应用程序正在运行。在

我有和这个班相似的东西

@namespace('/connect')
class ConnectNamespace(BaseNamespace):

    def on_send(self, data):
        # ...

但是,如果我从javascript客户机接收到事件,则一切正常,例如send事件被正确处理

如果我想在服务器端emit一些事件,我会有点不知所措。我可以用socket.send_packet在类内完成它

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

^{pr2}$

我只是不知道如何获取ConnectNamespaceInstance的实例

总而言之,我只想在收到post_save信号后向javascript客户机发送一个事件


Tags: send应用程序客户机信号packetsaveconnect事件
2条回答

您可能需要添加一个模块变量来跟踪连接,比如_connections,如下所示:

_connections = {}

@namespace('/connect')
class ConnectNamespace(BaseNamespace):

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

^{pr2}$

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

(没有对这些进行测试,但我在许多其他语言中使用了类似的模式:看不出这在Python中不起作用的任何原因)。在

另一个是费米的答案,我想肯定行得通。使用Redis可能会给您带来更多的灵活性,而使用gevent的greenlet可能会使这种方法更加“在框架中”,因为您已经在使用geventsocketio: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))

在你的储蓄后,你可以

^{pr2}$

相关问题 更多 >

    热门问题