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文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章