【问题标题】:How to return csv file from json data using Flask?如何使用 Flask 从 json 数据返回 csv 文件?
【发布时间】:2020-07-21 17:16:08
【问题描述】:

我正在尝试将 json 数据发送到我的烧瓶应用程序并让它返回一个 CSV 文件。我的 ajax 请求通过 POST 请求将 JSON 数据发送到视图,然后视图应该返回一个 csv 文件。但是,它无法在浏览器中将 csv 文件作为下载返回。我不知道如何让它工作,或者它是否可能。谢谢!

// AJAX - Send data over to python and return csv 
$("#export").click(
    function(){
        $.ajax({
            url: "/dbCSV",
            type: "POST",
            contentType: 'application/json;charset=UTF-8',
            dataType:"json",
            data: JSON.stringify(datam)
        });
    
        event.preventDefault();
    }
);
@analyzers.route("/dbCSV", methods=["GET","POST"])
def dbCSV():
    if request.method=="POST":
        data = pd.DataFrame(request.get_json())
        resp = make_response(data.to_csv())
        resp.headers["Content-Disposition"] = "attachment; filename=export.csv"
        resp.headers["Content-Type"] = "text/csv"
        return resp 
    return jsonify({"msg":"Could not generate CSV File"})

【问题讨论】:

    标签: json python-3.x flask export-to-csv


    【解决方案1】:

    我建议将send_file(...)BytesIO(文件流)对象一起使用:

    from io import BytesIO
    
    from flask import send_file
    ...
    
    response_stream = BytesIO(data.to_csv().encode())
    return send_file(
        response_stream,
        mimetype="text/csv",
        attachment_filename="export.csv",
    )
    

    请记住,使用 AJAX 发送 POST 请求时,您将无法打开下载提示。相反,您将简单地接收作为 AJAX 响应的文件。要解决这个问题,你必须看看这个问题:

    download file using an ajax request

    也许你的代码已经在运行,而这是你的问题——我看不出来。

    【讨论】:

    • 当然这必须添加到函数中,否则return 语句在这里没有意义;)
    • 我已经尝试过了,但它仍然不允许我下载文件。我什至在 ajax 调用的成功部分添加了window.location="/dbCSV";,但它仍然无法正常工作。
    • 你能调试一下你实际上是在发送响应吗(例如,通过在函数中添加一些print's)?另外,尝试添加一个不需要任何参数的 GET 端点,只返回 CSV,例如pd.DataFrame(numpy.array([1, 2])),然后您可以使用浏览器导航到相应的 URL 进行测试。
    • 我尝试在数据帧和 send_file 片段周围添加一堆打印语句,以及将 JSON 数据转换为数据帧然后转换为 CSV 文件的部分工作正常。无论出于何种原因,我仍然没有看到 csv 下载。我还尝试在按钮 IE <button> <a href="/dbCSV"> Export </a></button> 周围使用 <a> 标签,但效果不佳。
    【解决方案2】:

    我终于明白了。基本上我可以使用flask 库中的session 对象来存储用户输入。这允许不同的函数访问它,而不必担心创建全局变量或通过函数或对象传递它们。

    注意 1- 如果需要保存的用户数据量很大,那么在这种情况下使用 Redis 或其他类型的内存数据存储将是更好的选择。

    【讨论】:

      【解决方案3】:

      将 csv 文件保存在静态路径中,然后使用该静态路径 csv URL 从浏览器获取 csv 文件的下载形式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-01
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多