我正在运行一个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):
,然后添加initialize
和disconnect
方法,这些方法使用一些可以稍后引用的快乐标识符:
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)