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

Flask-SocketIO服务端未重载更新,修改代码后报错求助

解决Flask-SocketIO修改代码后仍报旧错误的问题

看起来你遇到了两个核心问题:旧服务进程残留导致新代码未生效,以及服务端与客户端的参数传递逻辑不匹配。咱们一步步来搞定:

第一步:彻底清理残留的服务端进程

你提到重启app.py后还是报旧代码的错误,大概率是之前的Flask-SocketIO进程没完全终止,还在占用8000端口,导致新代码根本没跑起来。

不同系统的清理方式:

  • Windows:
    1. 打开命令提示符,运行:
      netstat -ano | findstr :8000
      
    2. 找到输出里的PID(最后一列数字),杀掉进程:
      taskkill /F /PID <你的PID数字>
      
  • Linux/macOS:
    1. 打开终端,运行:
      lsof -i :8000
      
    2. 找到对应PID,执行:
      kill -9 <你的PID数字>
      

清理完后重新启动app.py,确保是新代码在运行。

第二步:修正服务端与客户端的参数传递逻辑

你修改了handle_message来接收name和age参数,但客户端发送的是字典,这会导致参数不匹配——旧代码接收字符串,现在如果服务端要接收多个独立参数,客户端不能发字典;如果客户端要发字典,服务端得用单个参数承接。

两种正确的写法:

写法1:服务端接收多个独立参数,客户端传递对应值

修改后的app.py:

from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

# 接收两个独立参数
@socketio.on('message')
def handle_message(name, age):
    print(f'received name: {name}, age: {age}')

if __name__ == '__main__':
    socketio.run(app, port=8000)

修改后的demo.py:

from socketIO_client import SocketIO, LoggingNamespace

def on_message_response(*args):
    print('on_message_response', args)

with SocketIO('localhost', 8000, LoggingNamespace) as socketIO:
    # 传递两个独立参数,而非字典
    socketIO.emit('message', 'DJay', 30, on_message_response)
    socketIO.wait_for_callbacks(seconds=1)

写法2:服务端接收字典参数,客户端发送字典

修改后的app.py:

from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

# 接收字典类型的单个参数
@socketio.on('message')
def handle_message(data):
    name = data.get('name')
    age = data.get('age')
    print(f'received name: {name}, age: {age}')

if __name__ == '__main__':
    socketio.run(app, port=8000)

修改后的demo.py:

from socketIO_client import SocketIO, LoggingNamespace

def on_message_response(*args):
    print('on_message_response', args)

with SocketIO('localhost', 8000, LoggingNamespace) as socketIO:
    # 发送字典数据
    socketIO.emit('message', {'name': 'DJay', 'age': 30}, on_message_response)
    socketIO.wait_for_callbacks(seconds=1)

最后验证

先杀掉所有残留进程,再启动修改后的app.py,然后运行demo.py,应该就能正常接收参数,不会再报旧的类型错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:21:46