请求对象没有属性'body - Flask

0 投票
2 回答
45 浏览
提问于 2025-04-14 17:58

我现在有三个不同的结果,它们都是以json格式呈现的,我想把这些结果通过API展示出来。我在用Flask来处理这个POST请求。这一切都应该通过负载(payloads)来完成。所以,这三个json对应着三个不同的URL。之前我使用的是硬编码的路径来获取结果。现在的新要求是,我需要动态地获取所有需要的数据路径,并展示结果。

下面的代码是我用来展示POST请求的,还有一个main_func()函数是我用来获取数据的。每次我运行这段代码时,都会出现一个错误 - “Request对象没有属性'body'”。我在这里有点困惑,想要动态获取结果。

@app.route('/result_spec', methods=['POST'])
def get_result_spec():
    try:
        payload = get_params_api(request)

        result_spec, _, _ = main_func(request = payload)

        return jsonify({"result_spec": result_spec})

    except Exception as e:
        return jsonify({"error": str(e)}), 500
def get_params_api(request):
        # if request and hasattr(request, 'body'):
        if request is not None:  
            json_body = json.loads(request.body)

        # if json_body is not None:
            ads_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()

        payload = {
            "csv_path": csv_path,
            "json_path": json_path,
            "input_path": input_path,
            "dependent_variable": dependent_variable,
            "files_geo": files_geo,
            "variable_name": variable_name,
            "trans_and_values": trans_and_values
        }

        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"]
    
    # store_path_list = get_s3_directory_tree(input_path)
    spath_list = get_s3_directory_tree(input_path)
    df_data = get_S3_csv_data(spath_list[0])
    header_ = get_header_names(df_data)

    sp = read_json(json_path, header_)


    result_spec = None
    result_json = None

    if user_specific_geo:
        # result_spec, result_json, result_json_const  = main_pipeline_user_specific_copy(spec, files, input_path, files_geo, dependent_variable, variable_name, trans_and_values)
        result_spec, result_json, result_json_const  = main_pipeline_user_specific(spec,store_path_list, files_geo, dependent_variable, variable_name, trans_and_values)
    else:  
       result_spec, result_json, result_json_const = main_pipeline(spec, dependent_variable,store_path_list)

    # payload_data = {"result_spec" : result_spec, "result_json" : result_json,
    #            "result_json_const" : result_json_const}

    return result_spec, result_json , result_json_const



if __name__ == "__main__":
    payload = get_params_api(request=None)
    result_spec,result_json_const, result_json = main_func(params=payload)

2 个回答

0

要获取通过POST请求传递的数据,你可以使用下面的任意一种方法。

request.json.get('csv_path')

或者

request.get_json('csv_path')  # as Detlef replied

请求对象是没有主体内容的。

对于GET请求,你可以使用 request.args.get('csv_path') 来获取数据。

另外,你可以通过去掉 get_params_api() 这个函数来优化代码,直接在 main_func() 中获取必要的参数,就像上面的例子那样。

0

请求对象其实没有一个叫做 body 的属性。如果你想要请求以 json 格式的数据,但又不想使用 json 这个包的话,可以使用请求对象的 get_json() 函数。

json_body = request.get_json()

撰写回答