Flask: загрузите CSV-файл, нажав кнопку

Я только начал работать с Flask/Python. Чего я хочу добиться, так это того, что у меня есть кнопка загрузки в моем HTML, и она вызывает следующую функцию:

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

Неполный код колбы:

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

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ загрузить этот CSV-файл или вернуть его в виде строки JSON, чтобы я мог загрузить его с помощью Javascript. Любая идея, как я могу отправить его в формате JSON или, возможно, загрузить его через сам Flask? Какой лучший способ?

3 ответа

Решение

Вот один из способов загрузить файл CSV без 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)

Ты можешь использовать flask.send_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)

Для начала нужно импортировать из колбы make_response, который сгенерирует ваш ответ и создаст переменную, что-то вроде response, Во-вторых, сделать response.content_type = "text/csv"В-третьих - верните свой ответ.

Другие вопросы по тегам