web-dev-qa-db-fra.com

Flacon: Téléchargez un fichier csv en cliquant sur un bouton

Je viens de commencer avec Flask/Python. Ce que je veux réaliser, c'est que j'ai un bouton de téléchargement dans mon HTML et qu'il appelle la fonction suivante:

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

Le code flask incomplet est:

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

Le problème auquel je suis confronté est que je ne peux pas trouver un moyen de télécharger ce fichier csv ou de le renvoyer sous forme de chaîne JSON afin que je puisse le télécharger en utilisant Javascript. Une idée comment je peux l'envoyer en JSON ou peut-être le télécharger via Flask lui-même? Quelle est la meilleure façon?

36
Tarun Dugar

Voici une façon de télécharger un fichier CSV sans 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)
47
Robᵩ

Vous pouvez utiliser flask.send_file() pour envoyer un fichier statique:

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)
30
kay