Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Flask从json数据返回csv文件?_Json_Python 3.x_Flask_Export To Csv - Fatal编程技术网

如何使用Flask从json数据返回csv文件?

如何使用Flask从json数据返回csv文件?,json,python-3.x,flask,export-to-csv,Json,Python 3.x,Flask,Export To Csv,我正在尝试向我的flask应用程序发送json数据,并让它返回CSV文件。我的ajax请求通过POST请求向视图发送JSON数据,然后视图应该返回csv文件。但是,它无法在浏览器中将csv文件作为下载返回。我不知道如何让它工作,或者它是否可能。谢谢 // AJAX - Send data over to python and return csv $("#export").click( function(){ $.ajax({

我正在尝试向我的flask应用程序发送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();
    }
);

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

我建议使用
发送文件(…)
BytesIO
(文件流)对象:

从io导入字节io
从flask导入发送\u文件
...
响应\u stream=BytesIO(data.to\u csv().encode())
返回发送文件(
响应流,
mimetype=“text/csv”,
附件_filename=“export.csv”,
)
请记住,在使用AJAX发送POST请求时,您将无法打开下载提示。相反,您将只接收作为AJAX响应的文件。要解决此问题,您必须查看以下问题:


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

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


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

当然这必须添加到函数中,否则
return
语句在这里没有意义;)我已经试过了,但它仍然不允许我下载文件。我甚至添加了
window.location=“/dbCSV”到ajax调用的成功部分,它仍然不起作用。您是否可以调试您是否确实发送了响应(例如,通过在函数中添加一些
打印
)?另外,尝试添加一个不需要任何参数的GET端点,只返回CSV,例如
pd.DataFrame(numpy.array([1,2])
,然后,您可以使用浏览器导航到相应的URL来测试它。我尝试在dataframe和send_file片段周围添加一组打印语句,JSON数据转换为dataframe然后转换为CSV文件的部分工作正常。无论出于什么原因,我仍然没有看到csv下载。我还尝试使用一个不太好用的
@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"})