如何下载带有Python Flask的生成器?

2024-04-23 17:58:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个应用程序,它生成最终用户将下载的大量数据(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)

现在,我要做的是将生成器和一些附加数据一起传递给应用程序中的另一个视图/页面,这样类似于:

^{pr2}$

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

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

  1. 在页面之间传递生成器
  2. 将发电机作为标准连杆返回 (<a href={{generator}}></a>或类似的东西)

Tags: 文件csv数据用户nameform应用程序表单
1条回答
网友
1楼 · 发布于 2024-04-23 17:58:57

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

生成器是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

相关问题 更多 >