Flask-SocketIO与Flask-Session集成时会话数据无法持久化的问题求助
Flask-SocketIO与Flask-Session集成时会话数据无法持久化的问题求助
我正在部署一个基于Gunicorn运行的Flask应用,集成了Flask-SocketIO和Flask-Session。我的需求是在SocketIO的connect事件触发时,将客户端的会话ID存储在服务端(通过Flask-Session),以便后续请求能识别该客户端,但目前遇到了会话数据无法持久化的问题:在connect事件里我用session['sid'] = request.sid保存了客户端的sid,在同一个事件里能正常读取,但到disconnect事件里用session.get('sid')获取时,得到的却是默认值None。而且不仅SocketIO事件里有这个问题,HTTP路由请求中也存在同样的会话数据不持久的情况。
以下是我的代码结构和相关代码:
核心代码展示
server/server.py 文件
from server.routes.socketio_routes import init_socketio_routes def init_routes(app, socketio): init_app_routes(app, socketio) init_socketio_routes(socketio) def create_app(): app = Flask(__name__) app.config['SECRET_KEY'] = 'secret_key' app.config['SESSION_TYPE'] = 'cachelib' app.config['SESSION_FILE_DIR'] = FileSystemCache(cache_dir='sessions') Session(app) socketio = SocketIO(app, manage_session=False) init_routes(app, socketio) return app, socketio
server/routes/socketio_routes.py 文件
def init_socketio_routes(socketio: SocketIO): @socketio.on('connect') def handle_connect(): session['sid'] = request.sid print(f"Session ID: {session.get('sid')} connected") @socketio.on('disconnect') def handle_disconnect(): sid = session.get('sid') print(f"Session ID: {sid} disconnected")
app.py 文件
from server.server import create_app app, socketio = create_app()
启动脚本 launch.sh
#!/bin/bash #This script launches the Server. if ! source .venv/bin/activate ; then exit 1 ; fi gunicorn -w 1 -k eventlet app:app exit $?
应用文件结构
├── server/ │ ├── routes/ │ │ ├── app_routes.py │ │ └── socketio_routes.py │ └── server.py │ ├── .gitignore ├── README.md ├── app.py ├── launch.sh ├── requirements.txt
当前运行输出
Session ID: AGDnl9e1mTkki6XAAAAB connected server=127.0.0.1:8000//socket.io/ client=127.0.0.1:46222 socket shutdown error: [Errno 9] Bad file descriptor Session ID: None disconnected
我已经尝试过的解决方法
- 更换Gunicorn的worker类型,比如从eventlet换成gevent
- 集成Flask-CORS,修改create_app中的初始化代码:
Session(app) CORS(app) socketio = SocketIO(app, manage_session=False) - 将SocketIO的
manage_session参数设为True,但这会导致HTTP请求无法访问会话数据 - 更换Session的存储类型,比如从
cachelib换成filesystem - 清理缓存、浏览器Cookie以及本地会话文件
- 在
session['sid'] = request.sid之后添加session.modified = True标记会话已修改
但以上方法都没有解决我的问题,希望能得到大家的帮助!
备注:内容来源于stack exchange,提问作者CallmeEchoo
相关产品推荐
相关产品推荐

