如何在Flask函数中访问Flask-WebSocket的会话?
Flask与Flask-SocketIO会话不共享的解决方案
你遇到的核心问题是Flask的HTTP请求会话和Flask-SocketIO的WebSocket会话默认未正确同步。在SocketIO的log事件处理器中修改session['name']后,会话变更没有持久化到客户端Cookie,导致后续访问/dir的HTTP请求读取到空会话,触发重定向循环。
解决步骤
1. 手动提交SocketIO会话修改
SocketIO中修改会话后,需要显式调用保存方法,确保会话数据同步到客户端Cookie。
2. (可选生产环境)改用服务器端会话存储
默认的客户端SecureCookieSession容易出现同步问题,推荐用Redis等服务器端存储,让HTTP和WebSocket会话共享同一数据源。
修改后的后端代码
from flask import Flask, session, render_template, url_for, redirect from flask_socketio import SocketIO, join_room, emit app = Flask(__name__) boards = {} socketio = SocketIO(app, manage_session=True) app.secret_key = "temporary" @app.route('/') def index(): return render_template('wait.html') @app.route('/dir') def foo(): if "name" in session: return "已登录,欢迎访问!" # 替换为你的业务逻辑 else: return redirect(url_for("index")) @socketio.on('log') def connection(request): if "name" not in session: join_room('waiting') session['name'] = 'craig' # 强制保存会话,更新客户端Cookie socketio.save_session(request.sid, session) emit('redirect', url_for('foo'), room='waiting') else: pass if __name__ == '__main__': socketio.run(app, port=5000, debug=True)
生产环境推荐方案:服务器端会话
安装flask-session和redis依赖后,用Redis存储会话,彻底避免Cookie同步问题:
from flask import Flask, session, render_template, url_for, redirect from flask_socketio import SocketIO, join_room, emit from flask_session import Session import redis app = Flask(__name__) app.secret_key = "temporary" # 配置Redis会话存储 app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = redis.Redis(host='localhost', port=6379) app.config['SESSION_SOCKETIO_ENABLE'] = True # 开启SocketIO共享会话 # 初始化组件 Session(app) socketio = SocketIO(app, manage_session=False) # 禁用SocketIO自带会话管理 # 路由和事件处理器保持不变...
内容的提问来源于stack exchange,提问作者user12967009
相关产品推荐
相关产品推荐

