Flask-SocketIO服务端未重载更新,修改代码后报错求助
解决Flask-SocketIO修改代码后仍报旧错误的问题
看起来你遇到了两个核心问题:旧服务进程残留导致新代码未生效,以及服务端与客户端的参数传递逻辑不匹配。咱们一步步来搞定:
第一步:彻底清理残留的服务端进程
你提到重启app.py后还是报旧代码的错误,大概率是之前的Flask-SocketIO进程没完全终止,还在占用8000端口,导致新代码根本没跑起来。
不同系统的清理方式:
- Windows:
- 打开命令提示符,运行:
netstat -ano | findstr :8000 - 找到输出里的PID(最后一列数字),杀掉进程:
taskkill /F /PID <你的PID数字>
- 打开命令提示符,运行:
- Linux/macOS:
- 打开终端,运行:
lsof -i :8000 - 找到对应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
相关产品推荐
相关产品推荐

