Python Flask中如何在GET请求中获取此前POST请求传入的数据
问题根源
HTTP协议是无状态的,你在POST请求分支中定义的create_row_data是视图函数的局部变量,单次请求处理完成后,该变量会随请求上下文一同销毁,GET请求是完全独立的新请求,自然无法直接读取之前POST请求产生的变量值。
可行解决思路
方案1:使用Flask自带session存储(适合小体量非敏感数据,快速实现)
Flask的session默认将数据加密后存储在客户端Cookie中,可实现同一客户端跨请求的数据共享。
修改后的代码示例:
from flask import Flask, jsonify, request, session # 导入session import json app = Flask(__name__) app.config['SECRET_KEY'] = '替换为你自己的随机加密字符串' # 必须配置,用于加密session数据 @app.route('/', methods=['GET', 'POST']) def get_data(): if request.method =='POST': data = request.get_json() p_name = data['name'] p_type = data['type'] p_end = data['end'] p_step = data['step'] create_row_data = {'p_name': str(p_name), 'p_type': str(p_type), 'p_end': str(p_end), 'p_step': str(p_step)} # 将数据存入session session['create_row_data'] = create_row_data return jsonify(create_row_data) if request.method == 'GET': # 从session读取数据 create_row_data = session.get('create_row_data') if create_row_data: # 此处加入你生成表格的逻辑 return jsonify(create_row_data) return "未找到对应数据,请先发送POST请求", 404
方案2:服务端缓存存储(适合生产环境、数据量大、多实例部署场景)
如果需要支持多用户访问、多进程/多worker部署,推荐使用Redis作为中间缓存存储:
- 先安装依赖:
pip install redis - 代码示例:
from flask import Flask, jsonify, request import redis, json app = Flask(__name__) # 初始化redis连接 redis_client = redis.Redis(host='127.0.0.1', port=6379, db=0, decode_responses=True) @app.route('/', methods=['GET', 'POST']) def get_data(): # 用客户端的session id作为唯一key,区分不同用户的数据 user_key = f"user_data:{request.cookies.get('session', 'default')}" if request.method =='POST': data = request.get_json() p_name = data['name'] p_type = data['type'] p_end = data['end'] p_step = data['step'] create_row_data = {'p_name': str(p_name), 'p_type': str(p_type), 'p_end': str(p_end), 'p_step': str(p_step)} # 将数据转为json字符串存入redis,设置1小时过期 redis_client.setex(user_key, 3600, json.dumps(create_row_data)) return jsonify(create_row_data) if request.method == 'GET': data_str = redis_client.get(user_key) if data_str: create_row_data = json.loads(data_str) # 此处加入你生成表格的逻辑 return jsonify(create_row_data) return "未找到对应数据,请先发送POST请求", 404
方案3:全局变量临时测试(仅本地单进程测试用,禁止生产使用)
如果只是本地临时测试,且只有单进程单worker运行,可以用全局变量存储,缺点是多请求并发会出现数据串扰,服务重启后数据清空,多worker部署时无法共享数据:
from flask import Flask, jsonify, request import json app = Flask(__name__) # 定义全局变量存储数据 global_row_data = None @app.route('/', methods=['GET', 'POST']) def get_data(): global global_row_data if request.method =='POST': data = request.get_json() p_name = data['name'] p_type = data['type'] p_end = data['end'] p_step = data['step'] create_row_data = {'p_name': str(p_name), 'p_type': str(p_type), 'p_end': str(p_end), 'p_step': str(p_step)} global_row_data = create_row_data return jsonify(create_row_data) if request.method == 'GET': if global_row_data: # 此处加入你生成表格的逻辑 return jsonify(global_row_data) return "未找到对应数据,请先发送POST请求", 404
注意事项
- 方案1的默认session存储在客户端,不要存储敏感信息,若需要存储敏感数据可以使用
flask-session扩展改用服务端存储session - 生产环境优先选择方案2,Redis的过期时间可以根据你的业务需求调整
- 如果需要长期存储数据,可以将数据存入MySQL、SQLite等关系型数据库
内容的提问来源于stack exchange,提问作者SL42
相关产品推荐
相关产品推荐

