Flask-socketio,向另一个命名空间发出事件

Posted

技术标签:

【中文标题】Flask-socketio,向另一个命名空间发出事件【英文标题】:Flask-socketio, emit an event to another namespace 【发布时间】:2014-09-06 21:29:00 【问题描述】:

我正在使用 Flask-socketio (http://flask-socketio.readthedocs.org/en/latest/)。

我目前正在获得一个

KeyError: '/local'

在 events.py 中使用它时。注意不同的命名空间:

@socketio.on('connect', namespace='/photo')
def client_connect():
    emit('event',  'type': 'client_connect' , namespace='/local')

使用 Flask-socketio 是否可以将事件发生在单独的命名空间中?文档似乎是这样建议的,但我无法弄清楚为什么我不断收到 KeyError。

编辑:感谢@Miguel 提出的答案,我再次尝试(离开该项目很长时间后)但仍然遇到以下问题:

@socketio.on('connect', namespace='/local')
def local_client_connect():
    print ('Local client connected.')

@socketio.on('connect', namespace='/photo')
def client_connect():
    print ('Client connected.')
    send('client_connect', namespace='/local')

当我运行应用程序时,我看到打印的“本地客户端已连接”。只有这样我才允许客户端访问 /photo 路由。我看到打印了“客户端已连接”,然后当然是 keyerror。

我已将 flask-socketio 升级到 0.4.2。

最好的

安德鲁

【问题讨论】:

你有没有找到任何解决方案,或者想出在这种情况下该怎么做?谢谢。 我想我最终在 node.js 中构建了整个东西!所以恐怕不会。 你是如何在nodejs socketio中实现的??上面的例子有用吗?? 这是很久以前的事了,但使用的是 socket.io,我认为是发送给单个客户端。您还可以将客户放在“房间”中并仅向该房间广播。查看 socket.io 网站,它有一些很好的例子。 你为什么选择回到 nodejs?您在这里遇到的所有复杂问题是什么? 【参考方案1】:

您需要在第二个命名空间上至少有一个处理程序。例如:

@socketio.on('connect', namespace='/local')
def local_client_connect():
    pass

然后 Flask-SocketIO 将知道 /local 并能够向它发出消息。

【讨论】:

嗨@Miguel,我尝试了你的建议,但我仍然在“本地”上收到 KeyError。第二个名称空间的处理程序在我的原始代码之前声明,并且也在它之前被调用,即。 local_client_connect() 发生在 client_connect() 之前。【参考方案2】:

我也遇到了同样的问题,就这样解决了。

@socketio.on('connect', namespace='/photo')
def client_connect():
    socketio.emit('event',  'type': 'client_connect' , namespace='/local')

【讨论】:

以上是关于Flask-socketio,向另一个命名空间发出事件的主要内容,如果未能解决你的问题,请参考以下文章

SilverStripe:如何向另一个网站发出 HTTP 请求?

如何向另一个线程发出带有数组参数的信号

我可以向另一个域发出 XMLHttpRequest 吗?

从一个进程向另一个 C++ 发出信号

如何使用客户的 IP 地址向另一个网站发出请求?

SaxonJS 发出多余的命名空间属性