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

5 投票
2 回答
9801 浏览
提问于 2025-04-18 13:31

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

目前我在 events.py 文件中遇到了一个

KeyError: '/local'

错误。请注意不同的命名空间:

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

使用 Flask-socketio,是否可以向与事件发生的命名空间不同的命名空间发送消息?文档似乎暗示可以这样做,但我搞不懂为什么我总是会遇到 KeyError。

编辑:感谢 @Miguel 提出的建议,我再次尝试(在离开这个项目很长一段时间后),但仍然在下面的代码中遇到 KeyError:

@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。

祝好

安德鲁

2 个回答

5

我也遇到过同样的问题,后来是这样解决的。

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

你需要在第二个命名空间上至少有一个处理器。比如说:

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

这样一来,Flask-SocketIO 就会知道 /local 这个路径,并且能够向它发送消息。

撰写回答