Flask中Request无body属性报错及动态路径API实现问题
问题解决与实现方案
1. 修复"Request' object has no attribute 'body'"错误
Flask的Request对象没有body属性,正确获取请求JSON数据的方式是使用request.get_json()方法,该方法会自动解析Content-Type为application/json的请求体,无需手动调用json.loads()。
2. 修正参数映射与变量名不一致问题
原代码存在变量名不匹配、参数映射错误的问题,比如:
ads_path应为csv_path(与后续payload键对应)- payload中的
dependent_variable对应请求中的variable,files_geo对应files_,variable_name对应variable_name1,trans_and_values对应t_and_v,需一一对应。
3. 实现三个独立的Flask API接口
针对三个JSON结果,创建三个POST接口:/result_spec、/result_json、/result_json_const,每个接口调用main_func后返回对应结果。
完整修正后的代码
from flask import Flask, request, jsonify import json # 假设以下依赖函数已实现:get_params, get_s3_directory_tree, get_S3_csv_data, get_header_names, read_json, main_pipeline_user_specific, main_pipeline app = Flask(__name__) @app.route('/result_spec', methods=['POST']) def get_result_spec(): try: payload = get_params_api(request) result_spec, _, _ = main_func(params=payload) return jsonify({"result_spec": result_spec}) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/result_json', methods=['POST']) def get_result_json(): try: payload = get_params_api(request) _, result_json, _ = main_func(params=payload) return jsonify({"result_json": result_json}) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/result_json_const', methods=['POST']) def get_result_json_const(): try: payload = get_params_api(request) _, _, result_json_const = main_func(params=payload) return jsonify({"result_json_const": result_json_const}) except Exception as e: return jsonify({"error": str(e)}), 500 def get_params_api(request): if request is not None: # 用get_json()获取请求体JSON,force=True可忽略Content-Type检查 json_body = request.get_json(force=True) csv_path = json_body["csv_path"] json_path = json_body["spec_path"] input_path = json_body["input_path"] variable = json_body["variable"] files_ = json_body["files_"] variable_name1 = json_body["variable_name1"] t_and_v = json_body["t_and_v"] else: # 本地测试默认参数 csv_path = r"file.csv" input_path = r"split_folder" json_path = r"sample_transformation.json" variable, files_, variable_name1, t_and_v = get_params() # 修正参数映射,确保键名与main_func中使用的一致 payload = { "csv_path": csv_path, "json_path": json_path, "input_path": input_path, "variable": variable, "files_": files_, "variable_name1": variable_name1, "t_and_v": t_and_v } return payload def main_func(params): csv_path = params["csv_path"] json_path = params["json_path"] input_path = params["input_path"] variable = params["variable"] files_ = params["files_"] variable_name1 = params["variable_name1"] t_and_v = params["t_and_v"] spath_list = get_s3_directory_tree(input_path) df_data = get_S3_csv_data(spath_list[0]) header_ = get_header_names(df_data) # 修正变量名:sp改为spec(与后续函数调用一致) spec = read_json(json_path, header_) result_spec = None result_json = None result_json_const = None # 假设user_specific_geo是可配置参数,这里暂时设为False(可根据实际需求调整或从params传入) user_specific_geo = False if user_specific_geo: # 修正变量名:store_path_list改为spath_list,参数与变量对应 result_spec, result_json, result_json_const = main_pipeline_user_specific( spec, spath_list, files_, variable, variable_name1, t_and_v ) else: result_spec, result_json, result_json_const = main_pipeline( spec, variable, spath_list ) return result_spec, result_json, result_json_const if __name__ == "__main__": # 本地测试时传入request=None,使用默认参数 payload = get_params_api(request=None) result_spec, result_json, result_json_const = main_func(params=payload) app.run(debug=True)
关键修改点说明
- 替换
request.body为request.get_json(force=True),解决属性不存在的错误,force=True允许在请求头未指定Content-Type时仍解析JSON。 - 统一变量名,修复参数映射错误,确保
get_params_api返回的payload键名与main_func中读取的键完全一致。 - 添加两个新的API接口,分别返回另外两个JSON结果,满足三个URL对应三个结果的需求。
- 修正
main_func中变量名不一致的问题(如spath_list与store_path_list、sp与spec)。
使用说明
调用接口时,需发送POST请求,请求体为JSON格式,示例如下:
{ "csv_path": "s3://your-bucket/path/to/data.csv", "spec_path": "s3://your-bucket/path/to/spec.json", "input_path": "s3://your-bucket/input-folder/", "variable": "target_var", "files_": ["geo_file1.csv", "geo_file2.csv"], "variable_name1": "display_name", "t_and_v": {"transform": "log", "values": [1,2,3]} }
内容的提问来源于stack exchange,提问作者new_coder
相关产品推荐
相关产品推荐

