我有一个基于Flask的网站,用户可以下载一些PDF文件。
使用Flask' send_file()
和send_from_directory()
可以直接实现。
例如:
@app.route('/downloadreport')
def download_report():
return send_from_directory(
'/reports',
'my_report.pdf',
as_attachment=True)
我想执行一些逻辑(让我们称之为after_download()
)下载完成后。
我已尝试使用@after_this_request
挂钩。但看起来send_file()
异步运行,因此@after_this_request
可能会在下载文件之前触发。
@after_this_request
。send_file()
使用WSGI的文件包装器来实现下载...也许这就是为什么它以异步方式运行?有没有办法拨打after_download()
,以便在send_file()
完成将文件发送给用户后保证能够投放?
答案 0 :(得分:7)
你做不到。虽然send_file
在使用开发服务器时使用Flask流式传输文件,但它可能(实际上应该是性能)在生产中使用Web服务器(nginx,apache等)和X-SendFile
。由于Web服务器无法控制应用程序,因此您运气不佳。