如何在Flask send_file()或send_from_directory()之后运行代码

时间:2015-03-22 07:47:09

标签: python download flask werkzeug

我有一个基于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
  • the documentation看起来像send_file()使用WSGI的文件包装器来实现下载...也许这就是为什么它以异步方式运行?

有没有办法拨打after_download(),以便在send_file() 完成将文件发送给用户后保证能够投放?

1 个答案:

答案 0 :(得分:7)

你做不到。虽然send_file在使用开发服务器时使用Flask流式传输文件,但它可能(实际上应该是性能)在生产中使用Web服务器(nginx,apache等)和X-SendFile。由于Web服务器无法控制应用程序,因此您运气不佳。