Flask应用如何将/configs路由计算结果传递到/sumcollect路由并追加到列表
Flask跨路由传值实现方案
你现有代码存在三个核心问题:
data函数没有返回计算结果,运算后的值直接被丢弃sumcollect路由内的value是局部变量,每次请求都会重新初始化,无法保留历史追加内容- 两个路由对应独立的HTTP请求,Flask默认请求之间数据不互通,需要额外存储介质实现数据传递
基础实现(单进程开发测试场景)
仅适合本地开发、单worker启动的场景,使用全局变量做存储:
from flask import Flask app = Flask(__name__) # 全局存储value列表,初始化默认值 value = [10, 20] def data(a,b): # 新增返回值,把计算结果透出 return a + b @app.route("/configs") def configs(): a = 10 b = 20 calc_result = data(a,b) # 声明要操作全局变量 global value value.append(calc_result) return f"计算结果{calc_result}已追加到统计列表" @app.route("/sumcollect") def sumcollect(): global value return f"当前value列表内容:{value}" if __name__ == "__main__": app.run(debug=True)
注意:该方案在生产环境多worker启动时会出现数据不一致,不同进程的全局变量相互独立
生产环境通用实现
生产环境推荐用独立的共享存储服务,比如Redis,所有进程读写同一份数据,保证一致性:
首先安装依赖:pip install flask redis
实现代码:
from flask import Flask import redis app = Flask(__name__) # 初始化Redis连接,根据实际情况修改配置 r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) # 初始化value列表,不存在的话就写入默认值 if not r.exists("sum_value"): r.rpush("sum_value", 10, 20) def data(a,b): return a + b @app.route("/configs") def configs(): a = 10 b = 20 calc_result = data(a,b) # 往Redis列表尾部追加值 r.rpush("sum_value", calc_result) return f"计算结果{calc_result}已追加到统计列表" @app.route("/sumcollect") def sumcollect(): # 取出Redis中列表的所有元素 value = r.lrange("sum_value", 0, -1) # 转换为数字类型 value = [int(i) for i in value] return f"当前value列表内容:{value}" if __name__ == "__main__": app.run(debug=True)
单用户隔离场景实现
如果需要每个用户的value列表互不干扰,可使用Flask自带的session存储:
from flask import Flask, session app = Flask(__name__) # 必须配置SECRET_KEY才能使用session功能 app.config["SECRET_KEY"] = "替换为你自己的加密密钥" def data(a,b): return a + b @app.route("/configs") def configs(): a = 10 b = 20 calc_result = data(a,b) # 初始化当前用户的value列表 if "value" not in session: session["value"] = [10, 20] session["value"].append(calc_result) # 标记session已修改(修改列表内部元素时需要手动标记) session.modified = True return f"计算结果{calc_result}已追加到你的个人统计列表" @app.route("/sumcollect") def sumcollect(): value = session.get("value", [10, 20]) return f"你当前的value列表内容:{value}" if __name__ == "__main__": app.run(debug=True)
内容的提问来源于stack exchange,提问作者Aniiya0978
相关产品推荐
相关产品推荐

