Flask:单击按钮下载csv文件[重复]

Posted

技术标签:

【中文标题】Flask:单击按钮下载csv文件[重复]【英文标题】:Flask: Download a csv file on clicking a button [duplicate] 【发布时间】:2015-07-13 12:47:23 【问题描述】:

我刚开始使用 Flask/Python。我想要实现的是我的 html 中有一个下载按钮,它调用以下函数:

function downloadPlotCSV() 
        $.ajax(
            url: "/getPlotCSV",
            type: "post",
            success: function(data) 
                dataPlot = JSON.parse(data);
                console.log(dataPlot);
            
        );
    

不完整的flask代码是:

@app.route('/getPlotCSV', methods = ['POST'])
def plotCSV():
    data = open("outputs/Adjacency.csv")

我面临的问题是我找不到下载此 csv 文件或将其作为 JSON 字符串返回的方法,因此我可以使用 javascript 下载它。知道如何将其作为 JSON 发送或通过 Flask 本身下载吗?最好的方法是什么?

【问题讨论】:

作为旁注,与帖子无关但有用,如果您真正想要的是获取一个真正是 json 的 csv 来将其解析为 javascript 对象,mimetype='text/json' 允许跳过解析部分。 我会将downloadPlotCSV 方法的type 参数更改为GET(在Python 代码部分中同上)。 【参考方案1】:

首先,您需要从烧瓶make_response 导入,这将生成您的响应并创建变量,例如response。 其次,制作response.content_type = "text/csv" 第三 - 返回您的回复。

【讨论】:

我使用了不同的方法作为回答。无论如何,也会尝试你的方法。谢谢:) 我明白了。在您的情况下,您从文件返回 JSONified 数据,而我返回 file.【参考方案2】:

这是一种无需 Javascript 即可下载 CSV 文件的方法:

#!/usr/bin/python

from flask import Flask, Response
app = Flask(__name__)

@app.route("/")
def hello():
    return '''
        <html><body>
        Hello. <a href="/getPlotCSV">Click me.</a>
        </body></html>
        '''

@app.route("/getPlotCSV")
def getPlotCSV():
    # with open("outputs/Adjacency.csv") as fp:
    #     csv = fp.read()
    csv = '1,2,3\n4,5,6\n'
    return Response(
        csv,
        mimetype="text/csv",
        headers="Content-disposition":
                 "attachment; filename=myplot.csv")


app.run(debug=True)

【讨论】:

嗨,Bob,我在实施您的解决方案时遇到了一个问题。这些行是字符串的连接,例如 row_1 = string_1 + ',' + string_2 + ',' + ..... 如果字符串内部有逗号,则逗号后面的字符将移动到下一列。我该如何解决?谢谢。 优秀而简单的解决方案,我正在寻找这样的解决方案。恭喜! 嗨 Rob,如果我想在下载文件后重定向到成功页面或错误页面。如何做到这一点?你能解释一下吗?【参考方案3】:

您可以使用flask.send_file()发送静态文件:

from flask import send_file

@app.route('/getPlotCSV') # this is a job for GET, not POST
def plot_csv():
    return send_file('outputs/Adjacency.csv',
                     mimetype='text/csv',
                     attachment_filename='Adjacency.csv',
                     as_attachment=True)

【讨论】:

这行得通。附带说明一下,如果用户想要获取一个真正是 json 的 csv 来将其解析为 javascript 对象,mimetype='text/json' 允许跳过解析部分。

以上是关于Flask:单击按钮下载csv文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS:单击按钮下载 CSV 文件

下载 csv 文件作为对 AJAX 请求的响应

为什么我的csv下载按钮仅适用于Chrome

为啥我的 csv 下载按钮只能在 Chrome 中使用

下载时如何具有特定的文件名[重复]

从 API 下载 AngularJS CSV 文件