python - 如何使用 Python Flask 下载生成器?

标签 python flask

我正在编写一个生成大量最终用户将下载的数据(CSV 文件)的应用程序。我目前有一个页面,它根据输入表单生成数据并将创建的生成器对象返回给用户,如下所示:

@app.route('/data', methods = ['GET', 'POST'])
def data():
    form = Form()
    if form.validate_on_submit():
        generator = create_generator(form)
        name = "results.csv"
        return Response(generator, mimetype="text/plain", headers={"Content-Disposition": "attachment;filename={}".format(name)})
    return render_template('data.html', title = 'Data Page', form = form)

现在,我想做的是获取该生成器以及一些额外的数据,并将其传递给应用程序中的另一个 View /页面,例如:

@app.route('/data', methods = ['GET', 'POST'])
def data():
    form = Form()
    if form.validate_on_submit():
        generator, data = create_generator(form)
        name = "results.csv"
        #Can't send data in a redirect, but for example...
        redirect('/result', generator=generator, data=data, name=name)
    return render_template('data.html', title = 'Data Page', form = form)

@app.route('/output', methods = ['GET', 'POST'])
def output():
    form = Form()
    return render_template('output.html', title = 'Output Page', generator=generator, data=data, name=name)

在哪里output.html然后会有一个可点击的链接来下载生成器。换句话说,生成器不会像第一个示例中那样立即返回 return Response()。 ,而是等待用户。

总而言之,我要做的主要两件事是:

  1. 在页面之间传递一个生成器
  2. 返回一个生成器作为标准链接 (<a href={{generator}}></a> 或类似的东西)

最佳答案

HTTP 协议(protocol)是无状态的,您所要求的是不可撤销的。在您发出请求之前,服务器不知道您在做什么,并且附加到客户端的唯一数据是随请求发送的数据。

生成器是一个 python 对象,因此不能像您建议的那样集成到 HTML 页面或链接中。您可以链接到您的应用中使用生成器流式传输内容的部分,但不使用生成器作为链接,这是没有意义的。

以下代码段描述了您可以做的最接近的事情。没有编写实际代码,我只是使用注释向您展示架构。

@app.route('/data', methods = ['GET', 'POST'])
def data():
    form = Form()
    if form.validate_on_submit():
        # Complete request
        # Generate data
        # Generate temp filename and save the result in it
        # Display (or redirect to) a page with a link to /get-result/{{ THE RESULT ID }}

    return render_template('data.html', title = 'Data Page', form = form)

@app.route('/get-result/<result_id>', methods = ['GET', 'POST'])
def output():
    # Open the result file based on its id
    # Stream it to the client as you did before

关于python - 如何使用 Python Flask 下载生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820331/

相关文章:

python - 在 Visual Studio Code 中的同一项目文件夹中使用 python 包

Python 初学者 - <bound method ... of <... object at 0x0000000005EAAEB8>> 来自哪里?

python - 可能的 Python Flask 内存泄漏

python - 当我使用 import urlparse 时,Heroku 日志显示 "No module named ' urlparse'"

memory - Tensorflow、Flask 和 TFLearn 内存泄漏

python - flask 中的线程数

Python 打印函数

python - 在 I/O 跟踪文件中查找缓存未命中、命中率

Python exec() 函数在 2.7 以上版本中损坏?错误: 'name' not defined

javascript - 使用ajax将值从javascript传递到python