我是第一次接触 Flask,遇到了一个小问题。我有一个带有表单和一堆复选框的页面。提交表单时,我从所有复选框中获取值并将其传递到基本上编写 CSV 文件的脚本(我已经有了)。
我所做的是在提交表单后,在后台创建 CSV 文件并立即发回给用户以供下载。我通过让我的脚本在内存中创建文件( using StringIO )然后使用 Flask 的 send_file 返回它来使这部分工作。 .
我还想在用户下载文件后通过向模板发送一条消息来给用户一些反馈(你可能会问,如果用户已经下载了文件,我为什么要通知他 - 我只是想给他一些额外的信息)。但是,在我的 View 函数返回 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)
最佳答案
我也遇到了同样的问题。到目前为止我发现的一个中途解决方案是做
return send_from_directory() and redirect(url_for())
关于python - 在 Flask 中,如何在 View 中返回 send_file 后重定向到模板并显示消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20306632/