2015-05-04 74 views
17

我刚开始使用Flask/Python。我想实现的是,我在我的HTML有一个下载按钮,它调用下面的功能:烧瓶:单击按钮下载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,如果你真正想要的是获得一个真正的json解析成JavaScript对象的csv,'mimetype ='text/json''允许跳过解析部分。 – Jacquot

+0

我会将'downloadPlotCSV'方法的'type'参数更改为'GET'(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。 其次,制作response.content_type = "text/csv" 第三 - 返回您的回应。

+0

我使用了不同的方法来回答。无论如何,也会尝试你的方法。谢谢:) –

+0

我明白了。在你的情况下,你返回* JSON化数据*文件,而我返回*文件*。 – 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

这起作用。作为一个附注,如果用户想获得一个真正的json的csv来将它解析成一个javascript对象,'mimetype ='text/json''允许跳过解析部分。 – Jacquot