2015-05-04 16 views
17

Ho appena iniziato con Flask/Python. Quello che voglio ottenere è che ho un pulsante di download nel mio HTML e chiama la seguente funzione:Flask: scarica un file csv facendo clic su un pulsante

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

Il codice pallone incompleta è:

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

Il problema che sto affrontando è che io non riesco a trovare un modo per scaricare questo file csv o restituirlo come una stringa JSON in modo da poterlo scaricare utilizzando Javascript. Qualche idea su come posso inviarlo come JSON o magari scaricarlo tramite Flask stesso? Qual è il modo migliore?

+0

Come nota a margine, irrilevante, ma utile alla post, se quello che vuoi veramente è ottenere un csv che è davvero un json per analizzarlo in un oggetto javascript, 'mimetype = 'text/json'' permette di saltare la parte di parsing. – Jacquot

+0

E cambierei l'argomento 'type' del metodo' downloadPlotCSV' in 'GET' (idem nella parte del codice Python). – Jacquot

risposta

25

Ecco un modo per scaricare un file CSV senza 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) 
+0

Ciao Bob Ho incontrato un problema quando ho implementato la tua soluzione. le righe sono concatenazione di stringhe, come row_1 = string_1 + ',' + string_2 + ',' + ..... Se le stringhe contengono una virgola, i caratteri dietro la virgola verranno spostati nella colonna successiva. Come posso risolverlo? Grazie. – LeonF

-1

In primo luogo è necessario importare dal pallone make_response, che genererà la vostra risposta e creare variabile, qualcosa come response. In secondo luogo, rendere response.content_type = "text/csv" In terzo luogo, restituire la risposta.

+0

Ho usato un approccio diverso come risposta. Ad ogni modo, proverò anche il tuo metodo. Grazie :) –

+0

Capisco. Nel tuo caso restituisci * i dati JSONified dal * file, mentre restituisco * il file *. – wanderlust

16

È possibile utilizzare flask.send_file() per inviare un file statico:

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) 
+0

Questo funziona. Come nota a margine, se l'utente desidera ottenere un csv che è davvero un json per analizzarlo in un oggetto javascript, 'mimetype = 'text/json'' consente di saltare la parte di analisi. – Jacquot

Problemi correlati