You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-SocketIO服务端接收消息后未触发对应事件处理函数排查

问题原因

你的问题由两个常见错误叠加导致:

  1. 服务端未配置跨域许可:Flask-SocketIO默认开启严格跨域校验,即使是本地回环访问也会拦截未许可的来源请求,收到事件后在校验阶段就直接返回400错误,不会进入你编写的事件处理函数,所以看不到RECEIVED相关日志。
  2. 客户端API调用不规范:python-socketio的Client.emit方法的消息体是第二个位置参数,你额外加了data=关键字参数传递消息,会导致服务端无法正确匹配事件参数。

修复步骤

  • 第一步:修改服务端SocketIO初始化配置,添加跨域许可
# 把全局的SocketIO初始化代码
socket = SocketIO(app, engineio_logger=True, logger=True)
# 替换为
socket = SocketIO(app, cors_allowed_origins="*", engineio_logger=True, logger=True)
  • 第二步:修正客户端emit的参数传递写法
# 把客户端emit调用
socket.emit('test', data='hello world', callback=message_callback)
# 替换为
socket.emit('test', 'hello world', callback=message_callback)
  • (可选兜底方案)如果修改后仍未生效,可以将事件注册逻辑移到服务端启动函数内,避免全局变量上下文异常:注释掉全局的@socket.on('test')装饰器,打开startup_server函数里注释的socket.on_event('test', handle_message)代码即可。

验证

修改完成后重启服务端和客户端,即可看到符合预期的日志输出:

  1. 服务端正常打印RECEIVED相关内容
  2. 客户端先收到emit回调返回的hello client,再收到reply事件的通知

内容的提问来源于stack exchange,提问作者Dave Lewis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 16:24:06