在Flask中,如何在视图中返回send_file后重定向到模板并显示消息?

时间:2013-11-30 22:59:30

标签: python flask

我第一次潜入Flask,我遇到了一个小问题。我有一个带有表单和一堆复选框的页面。提交表单时,我会从所有复选框中获取值并将其传递到基本上写入CSV文件的脚本(我已经拥有)。

我所做的是在提交表单后,CSV文件在后台创建并立即发送回用户下载。我通过让我的脚本在内存中创建文件(using StringIO)然后使用Flask的send_file返回它来使这部分工作。

我想要的是在用户通过向模板闪烁消息来下载文件后给用户一些反馈(你可以问我为什么要通知用户他是否已经下载了文件 - 我只是想要给他一些额外的信息)。但是,在我的视图函数返回send_file并在浏览器中显示下载对话框后,页面不会重新加载,因此flash消息无法通过。

我正在努力解决这个问题:如何返回文件并向用户显示消息?我知道每个请求只能有一个响应,所以如果我使用文件下载的一次机会,我可能需要另一个策略。有什么想法吗?

以下是我的“下载路线”的样子:

@app.route('/process', methods=["POST"])
def process():
    error = None
    if request.method == 'POST':
        # gets all checkbox values
        fields = request.form.getlist("field")

        # generates my csv file
        csv = generate_csv()

        if len(fields) != 0:
            csv = amxml2csv.xml2csv(xml, *fields)
            flash("Extraction succeeded!")
            return send_file(data, attachment_filename="newresults.csv", as_attachment=True)
        else:
            error = "No fields selected!"
    return render_template("index.html", error=error)

2 个答案:

答案 0 :(得分:0)

一种简单的方法是使用提交数据按钮打开两个端点,一个在新窗口中打开。

据推测,您正在反馈数据,因此您可能需要某种方式来缓存数据以供服务器解析......也许您可能会为您的反馈端点构建延迟,这可能会使数据可用于会话;或者留出时间为该端点功能检索。然后返回反馈。

答案 1 :(得分:0)

我在这里遇到同样的问题。到目前为止,我发现了一个半途而废的解决方案

  

返回send_from_directory()并重定向(url_for())