You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:23:29