2015-05-04 6 views
17

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

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

+0

В качестве примечания, неактуальной, но полезной для post, если то, что вы действительно хотите, - это получить csv, который действительно является json для его анализа в javascript-объекте, 'mimetype = 'text/json'' позволяет пропустить парсинг-часть. – Jacquot

+0

И я бы изменил аргумент 'type' метода' downloadPlotCSV' на 'GET' (idem в части кода Python). – Jacquot

ответ

25

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

Привет, Боб Я встретил проблему, когда я реализовал ваше решение. строки являются конкатенацией строк, например row_1 = string_1 + ',' + string_2 + ',' + ..... Если строки имеют запятую внутри, символы за запятой будут перемещены в следующий столбец. Как я могу это решить? Спасибо. – LeonF

-1

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

+0

Я использовал другой подход, как было сказано. В любом случае, попробуй свой метод тоже. Спасибо :) –

+0

Я вижу. В вашем случае вы возвращаете * JSONified данные из * файла, а я возвращаю * файл *. – wanderlust

16

Вы можете использовать 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) 
+0

Это работает. В качестве побочного примечания, если пользователь хочет получить csv, который действительно является json для его анализа в javascript-объект, 'mimetype = 'text/json'' позволяет пропустить парсинг-часть. – Jacquot

Смежные вопросы