Acabo de empezar con Flask/Python. Lo que quiero lograr es que tengo un botón de descarga en mi HTML y llama a la siguiente función:
function downloadPlotCSV() { $.ajax({ url: "/getPlotCSV", type: "post", success: function(data) { dataPlot = JSON.parse(data); console.log(dataPlot); } }); }
El código del matraz incompleto es:
@app.route('/getPlotCSV', methods = ['POST']) def plotCSV(): data = open("outputs/Adjacency.csv")
El problema al que me enfrento es que no puedo encontrar una manera de descargar este archivo csv o devolverlo como una cadena JSON para poder descargarlo usando Javascript. ¿Alguna idea de cómo puedo enviarlo como JSON o tal vez descargarlo a través de Flask? ¿Cuál es la mejor manera?
Aquí hay una forma de descargar un archivo CSV sin 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)
Puede usar flask.send_file()
para enviar un archivo estático:
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)
En primer lugar, debe importar desde el matraz make_response
, que generará su respuesta y creará una variable, algo así como response
. En segundo lugar, haga response.content_type = "text/csv"
En tercer lugar, devuelva su respuesta.