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

29

Я только начал работать с 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? Какой лучший способ?     

задан Tarun Dugar 04.05.2015 в 09:39
источник
  • В качестве побочного примечания, не относящегося к делу, но полезного для сообщения, если вы действительно хотите получить csv, который действительно является json для его анализа в javascript-объекте, mimetype = 'text / json' позволяет пропустить синтаксический анализ часть. –  Jacquot 10.12.2017 в 17:47
  • И я бы изменил аргумент типа метода downloadPlotCSV на GET (idem в части кода Python). –  Jacquot 10.12.2017 в 17:48

3 ответа

38

Вот один из способов загрузить файл 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)
    
ответ дан Robᵩ 05.05.2015 в 04:52
  • Привет, Боб. Я встретил проблему, когда я внедрил ваше решение. строки являются конкатенацией строк, например row_1 = string_1 + ',' + string_2 + ',' + ..... Если строки имеют запятую внутри, символы за запятой будут перемещены в следующий столбец. Как я могу это решить? Спасибо. –  LeonF 07.06.2016 в 01:03
23

Вы можете использовать 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)
    
ответ дан kay 05.05.2015 в 05:02
  • Это работает. В качестве примечания, если пользователь хочет получить csv, который действительно является json для его анализа в javascript-объект, mimetype = 'text / json' позволяет пропустить парсинг-часть. –  Jacquot 10.12.2017 в 17:46
-2

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

    
ответ дан wanderlust 04.05.2015 в 09:58
  • Я использовал другой подход, как было сказано. В любом случае, попробуй свой метод тоже. Благодаря :) –  Tarun Dugar 04.05.2015 в 10:02
  • Я вижу. В вашем случае вы возвращаете JSONified данные из файла, а я возвращаю файл. –  wanderlust 04.05.2015 в 10:34