基于Flask-JWT-Extended的令牌认证应用如何跨路由传递变量
问题根源说明
Flask 默认的 session 依赖签名 Cookie 实现存储,而 JWT 认证通常用于前后端分离场景,前端默认不会携带 Cookie,因此会出现 session 和 JWT 同时使用失效的问题。以下是适配 JWT 无状态特性的可落地方案:
Flask 场景实现方案
方案1:前端透传参数(最推荐,符合JWT无状态设计)
直接在/configs接口返回summ值,前端请求/sumcollect时主动携带该参数,不需要服务端额外存储状态:
# 先引入jwt_required装饰器保护私有路由,同时获取当前用户身份 from flask_jwt_extended import jwt_required, get_jwt_identity @app.route("/configs") @jwt_required() def configs(): a = random.randint(10,30) b = random.randint(1,5) summ = a+b # 把sum同步返回给前端 return jsonify({"a":a,"b":b,"summ":summ}) @app.route("/sumcollect") @jwt_required() def sumcollect(): # 从查询参数读取前端传递的sum值 summ = request.args.get("summ", type=int) if not summ: return jsonify({"msg": "缺少summ参数"}), 400 return jsonify({"sum is":summ})
方案2:服务端缓存(适合需要服务端留存数据的场景)
如果不想让前端处理参数,可使用Redis等缓存组件,以JWT解析出的用户身份作为键存储对应summ值,天然支持多用户数据隔离:
- 先安装依赖:
pip install redis - 代码示例:
import redis from flask_jwt_extended import jwt_required, get_jwt_identity # 初始化redis连接 r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) @app.route("/configs") @jwt_required() def configs(): current_user = get_jwt_identity() # 拿到当前登录用户的邮箱 a = random.randint(10,30) b = random.randint(1,5) summ = a+b # 存入redis,设置1小时过期避免无效数据占用空间 r.setex(f"sum:{current_user}", 3600, str(summ)) return jsonify({"a":a,"b":b}) @app.route("/sumcollect") @jwt_required() def sumcollect(): current_user = get_jwt_identity() summ = r.get(f"sum:{current_user}") if not summ: return jsonify({"msg": "请先访问/configs生成数据"}), 400 return jsonify({"sum is":int(summ)})
方案3:全局变量(仅适合测试、单实例部署且不需要用户隔离的场景)
如果是临时测试,且所有用户共用同一个summ值,可以用应用全局变量存储,注意多线程/多实例部署时会有数据不一致问题:
app = Flask(__name__) # 初始化全局存储变量 app.config['GLOBAL_SUM'] = None @app.route("/configs") def configs(): a = random.randint(10,30) b = random.randint(1,5) summ = a+b app.config['GLOBAL_SUM'] = summ return jsonify({"a":a,"b":b}) @app.route("/sumcollect") def sumcollect(): summ = app.config['GLOBAL_SUM'] if not summ: return jsonify({"msg": "请先访问/configs生成数据"}), 400 return jsonify({"sum is":summ})
Django 同场景适配方案
如果是 Django + JWT 技术栈,思路完全一致:
- 优先选择前端透传参数的无状态方案
- 需要服务端存储时使用 Django 自带缓存组件或 Redis,以 JWT 解析出的用户 ID 作为 key 存储对应变量即可
内容的提问来源于stack exchange,提问作者Aniiya0978
相关产品推荐
相关产品推荐

