2015-05-04 20 views
17

Właśnie zacząłem od Flask/Python. Co chcę osiągnąć jest to, że mam przycisk pobierania w moim HTML i wywołuje następującą funkcję:Flask: Pobierz plik csv po kliknięciu przycisku

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

Niekompletny kod kolbę:

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

Problem jestem stoi to, że nie mogę znaleźć sposobu na pobranie tego pliku csv lub zwrócenie go jako ciąg JSON, aby móc go pobrać za pomocą Javascript. Masz pomysł, jak mogę wysłać go jako JSON, czy może pobrać za pomocą samego Flask? Jaki jest najlepszy sposób?

+0

Na marginesie, nieistotnego, ale przydatne dla post, jeśli naprawdę chcesz uzyskać csv, który jest naprawdę jsonem, aby przetworzyć go na obiekt javascript, 'mimetype = 'text/json'' pozwala pominąć część parsującą. – Jacquot

+0

I chciałbym zmienić argument 'type' metody' downloadPlotCSV' na 'GET' (idem w części kodu Pythona). – Jacquot

Odpowiedz

25

Oto jeden sposób, aby pobrać plik CSV bez 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

Witaj, Bob, napotkałem problem, gdy zaimplementowałem Twoje rozwiązanie. wiersze są konkatenacją łańcuchów, takich jak row_1 = string_1 + ',' + string_2 + ',' + ..... Jeśli łańcuchy zawierają przecinek, znaki znajdujące się za przecinkiem zostaną przeniesione do następnej kolumny. Jak mogę to rozwiązać? Dzięki. – LeonF

-1

Najpierw należy zaimportować z kolby make_response, która wygeneruje odpowiedź i utworzy zmienną, np. response. Po drugie, zrób response.content_type = "text/csv" Po trzecie - zwróć odpowiedź.

+0

Użyłem innego podejścia jako odpowiedzi. Tak czy inaczej, wypróbuję również twoją metodę. Dzięki :) –

+0

Rozumiem. W twoim przypadku zwracasz * JSONified dane z * pliku, a ja zwracam * plik *. – wanderlust

16

Można użyć flask.send_file() wysłać plik statyczny:

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

To działa. Na marginesie, jeśli użytkownik chce uzyskać csv, który jest naprawdę jsonem, aby przetworzyć go na obiekt javascript, 'mimetype = 'text/json'' pozwala pominąć część parsującą. – Jacquot

Powiązane problemy