Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask是否可以显示列表中的数据并提供下载链接?_Python_Flask - Fatal编程技术网

Python Flask是否可以显示列表中的数据并提供下载链接?

Python Flask是否可以显示列表中的数据并提供下载链接?,python,flask,Python,Flask,我已经创建了一个Flask应用程序,它创建了一个列表并将列表返回到HTML页面。我还想让列表作为CSV文件下载 到目前为止,我了解如何将这些任务作为单独的功能来执行 有没有一种方法可以将这些函数合并为一个函数,以便只创建一次列表,在HTML模板上显示数据,并提供下载链接 请查看以下基本示例: from flask import Flask, render_template, Response, url_for app = Flask(__name__) @app.route('/') def

我已经创建了一个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>

{fruit%%中f的百分比}
  • {{f}
{%endfor%}
最简单的方法是在您的模块中定义一个全局变量,您可以从每个函数访问该变量

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')

我相信你的问题缺乏一点背景。当您说您的应用程序生成一个事物列表时,这意味着该列表是从一些数据生成的。数据存储在哪里?您可以参考Born2Discover:数据通过API调用创建并存储到数据库中。在我的主要项目中,我使用生成器函数来收集数据。然后,我将生成器的输出存储到列表对象,然后将其保存到数据库并显示在模板上。它在调试模式下工作得很好,但在生产环境中不起作用。也许使用flask.g是一种选择?这很奇怪。你犯了什么错误
Flask.g
将不起作用,因为它只在一个请求期间存储值。在您的情况下,您有两个单独的请求:一个请求显示html文件,另一个请求下载csv。请记住,我提交的代码与我正在处理的项目类似。收集数据并生成列表的函数可以轻松地将数据发送到全局变量。我在从另一个函数返回数据时遇到问题。当文件输出函数可以收集数据时,数据已消失,导致文件为空。我可能缺少一些内容,但如果将数据存储在全局列表中,则只要服务器运行,所有函数都可以访问数据。数据不能就这样消失了。我发现我可以在第一个函数中打印列表的内容。如果我对创建文件的函数尝试相同的操作,它将返回一个空列表。我同意你的观点,数据应该仍在该列表中,但第二个函数似乎根本无法正确访问它。