2017-01-03 47 views
0

我创建了一个Flask应用程序,它可以创建一个列表并将列表返回给HTML页面。我还想将列表下载为CSV文件。Flask是否可以显示列表中的数据并提供下载链接?

到目前为止,我理解如何以单独的功能完成这些任务。

有没有一种方法可以将这些功能合并为一个,以便只创建一次列表,在HTML模板上显示数据并提供下载链接?

请查看基本示例如下:

from flask import Flask, render_template, Response, url_for 

app = Flask(__name__) 

@app.route('/') 
def hello_world(): 
    fruits = ['apple', 'pear', 'banana', 'grapes', 'mango'] 
    return render_template('fruit.html', fruit=fruits) 


@app.route('/fruits.csv') 
def generate_fruit_file(): 
    def generate(): 
     fruits = ['apple', 'pear', 'banana', 'grapes', 'mango'] 
     for f in fruits: 
      yield ''.join(f) + '\n' 
    return Response(generate(), mimetype='text/csv') 


if __name__ == '__main__': 
    app.run(debug=True) 

HTML模板:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
{% for f in fruit %} 
    <ul> 
     <li style="display: block;">{{ f }}</li> 
    </ul> 
{% endfor %} 
    <a href="{{'/fruits.csv'}}">get file</a> 
</body> 
</html> 
+0

我相信你的问题缺乏一些背景。当你说你的应用程序生成了一个列表的东西,这意味着列表是从一些数据生成的。数据存储在哪里? – Born2Discover

+0

你可以参考http://stackoverflow.com/questions/24577349/flask-download-a-file – SunilT

+0

Born2Discover:数据是从API调用创建并存储到数据库中。在我的主要项目中,我使用生成器函数来收集数据。然后将生成器的输出存储到列表对象,然后将其保存到数据库并在模板上显示。 – user50083

回答

0

最简单的方法是定义你的模块中的全局变量fruits您从每个功能访问。

fruits = ['apple', 'pear', 'banana', 'grapes', 'mango'] 

@app.route('/') 
def hello_world(): 
    global fruits 
    return render_template('fruit.html', fruit=fruits) 


@app.route('/fruits.csv') 
def generate_fruit_file(): 
    def generate(): 
     global fruits 
     for f in fruits: 
      yield ''.join(f) + '\n' 
    return Response(generate(), mimetype='text/csv') 
+0

我最初试过这个。它在调试模式下效果很好,但在生产中不起作用。也许使用flask.g是一个选项? – user50083

+0

这很奇怪。你遇到了什么错误? 'Flask.g'将不起作用,因为它只在一个请求期间存储值。在你的情况下,你有两个单独的请求:一个请求显示你的html文件,一个请求下载csv。 – MrLeeh

+0

请记住,我提交的代码与我正在进行的项目相似。收集数据并生成列表的功能可以轻松地将数据发送到全局变量。我从另一个函数返回数据有问题。数据在文件输出功能可以收集它时导致空文件消失。 – user50083

相关问题