Flask: Download a csv file on clicking a button

77,271

Solution 1

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)

Solution 2

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)
Share:
77,271
Tarun Dugar
Author by

Tarun Dugar

Been working with frontend development for ~5 years. I mostly work with React/React Native. Github: https://github.com/tarun-dugar Medium: https://medium.com/@tarundugar1992 Twitter: https://twitter.com/tarun_red

Updated on September 10, 2020

Comments

  • Tarun Dugar
    Tarun Dugar over 3 years

    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?