在一个Flask响应中返回一个下载和渲染页面



我想返回一个呈现的页面和一个可下载的文件作为对请求的响应。我试图返回两个响应的元组,但它不起作用。如何提供下载和页面?

return response, render_template('database.html')
return render_template('database.html'), response

Flask有能力处理这种情况吗?这似乎是一个常见的问题,我只是想发回一个文件下载,然后渲染页面。

不能对单个请求返回多个响应。相反,生成文件并将其存储在某个位置,然后用另一条路由为其提供服务。返回渲染的模板,其中包含为文件提供服务的路由的url。

@app.route('/database')
def database():
    # generate some file name
    # save the file in the `database_reports` folder used below
    return render_template('database.html', filename=stored_file_name)
@app.route('/database_download/<filename>')
def database_download(filename):
    return send_from_directory('database_reports', filename)

在模板中,使用url_for生成下载url。

<a href="{{ url_for('database_download', filename=filename) }}">Download</a>

我只是在寻找更简单的东西,所以这里为那些寻找更简单东西的人提供了解决方案:

javascript的使用是一个非常简单而肮脏的解决方案。

例如:

<button onclick="goBack()"><a href="{{ url_for('export') }}">Export</a></button>
<script>
function goBack() {
  window.history.back();
}
</script>

JS会打开你以前的浏览器窗口,这意味着它保持不变。下载由ref启动。然后ref引导到函数所在的烧瓶路径。

最新更新