I have a Flask-based website where users can download some PDF files.
This is straightforward to implement using Flask's send_file()
and send_from_directory()
.
For example:
@app.route('/downloadreport')
def download_report():
return send_from_directory(
'/reports',
'my_report.pdf',
as_attachment=True)
I'd like to perform some logic (let's call it after_download()
) AFTER the download is complete.
I've tried using the @after_this_request
hook. But it looks like send_file()
runs asynchronously so @after_this_request
may fire before the file is downloaded.
- For example, if the file is very large, a download may take a while so
@after_this_request
seems to fire while the file is being downloaded. - It looks from the documentation like
send_file()
uses WSGI's file wrapper to effectuate the download...maybe that's why it's running asynchronously?
Is there a way to call after_download()
so that it's guaranteed to run after send_file()
has completed sending the file to a user?