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?
Firstly you need to import from flask make_response , that will generate your response and create variable, something like response . Secondly, make response. content_type = "text/csv" Thirdly - return your response.
In order to offer several files together as a download, you only have the option of compressing them in an archive. In my example, all files that match the specified pattern are listed and compressed in a zip archive. This is written to the memory and sent by the server.
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)
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With