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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:25:27