Flask: Download a csv file on clicking a button
77,271
Solution 1
Here is one way to download a CSV file with no Javascript:
#!/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)
Solution 2
You can use flask.send_file()
to send a static 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)
Author by
Tarun Dugar
Been working with frontend development for ~5 years. I mostly work with React/React Native. Github: https://github.com/tarun-dugar Medium: https://medium.com/@tarundugar1992 Twitter: https://twitter.com/tarun_red
Updated on September 10, 2020Comments
-
Tarun Dugar over 3 years
I just got started with Flask/Python. What I want to achieve is that I have a download button in my HTML and it calls the following function:
function downloadPlotCSV() { $.ajax({ url: "/getPlotCSV", type: "post", success: function(data) { dataPlot = JSON.parse(data); console.log(dataPlot); } }); }
The incomplete flask code is:
@app.route('/getPlotCSV', methods = ['POST']) def plotCSV(): data = open("outputs/Adjacency.csv")
The problem I am facing is that I cannot find a way to download this csv file or return it as a JSON string so I can download it using Javascript. Any idea how I can send it as JSON or maybe download it via Flask itself? What's the best way?