【问题标题】:Is it possible for Flask to display data from a list and provide a download link?Flask 是否可以显示列表中的数据并提供下载链接?
【发布时间】:2017-05-17 13:23:56
【问题描述】:

我创建了一个 Flask 应用程序,它创建一个列表并将该列表返回到一个 HTML 页面。我还想将列表作为 CSV 文件下载。

到目前为止,我了解如何将这些任务作为单独的功能来完成。

有没有办法将这些功能组合成一个列表,只创建一次列表,在 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>

【问题讨论】:

  • 我相信你的问题缺乏背景。当您说您的应用程序生成一个事物列表时,这意味着该列表是从某些数据生成的。这些数据存储在哪里?
  • Born2Discover:数据通过 API 调用创建并存储到数据库中。在我的主要项目中,我使用生成器函数来收集数据。然后,我将生成器的输出存储到列表对象中,然后将其保存到数据库并在模板上显示。

标签: python flask


【解决方案1】:

最简单的方法是在您的模块中定义一个全局变量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')

【讨论】:

  • 我最初尝试过这个。它在调试模式下工作得很好,但在生产中却不行。也许使用 flask.g 是一种选择?
  • 这很奇怪。你遇到了什么错误? Flask.g 不起作用,因为它只在一个请求期间存储值。在您的情况下,您有两个单独的请求:一个请求显示您的 html 文件,另一个请求下载 csv。
  • 请记住,我提交的代码与我正在进行的项目相似。收集数据并生成列表的函数可以轻松地将数据发送到全局变量。我从另一个函数返回该数据时遇到问题。当文件输出函数可以收集数据时,数据已经消失,导致空文件。
  • 我可能遗漏了一些东西,但是如果您将数据存储在全局列表中,只要您的服务器运行,就可以从所有功能访问它。数据不能就这么消失了。
  • 我发现我可以从第一个函数中打印列表的内容。如果我对创建文件的函数尝试相同的操作,它会返回一个空列表。我同意您的观点,数据仍应在该列表中,但似乎第二个函数根本无法正确访问它。
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 2019-06-07
  • 2011-12-24
  • 2021-11-26
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多