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

toh*_*ter 9 python download werkzeug flask

我有一个基于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)
Run Code Online (Sandbox Code Playgroud)

我想在下载完成后执行一些逻辑(让我们称之为after_download()).

我试过使用@after_this_request钩子.但它看起来像是send_file()异步运行,因此@after_this_request可能会在下载文件之前触发.

  • 例如,如果文件非常大,下载可能需要一段时间,因此@after_this_request在下载文件时似乎会触发.
  • 它从文档中看起来像send_file()使用WSGI的文件包装器来实现下载......也许这就是为什么它以异步方式运行?

有没有一种方法来调用after_download(),这样它保证后运行send_file()完成的文件发送到用户?

dav*_*ism 8

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