Remove file after Flask serves it

after_request runs after the view returns but before the response is sent. Sending a file may use a streaming response; if you delete it before it’s read fully you can run into errors.

This is mostly an issue on Windows, other platforms can mark a file deleted and keep it around until it not being accessed. However, it may still be useful to only delete the file once you’re sure it’s been sent, regardless of platform.

Read the file into memory and serve it, so that’s it’s not being read when you delete it later. In case the file is too big to read into memory, use a generator to serve it then delete it.

@app.route('/download_and_remove/<filename>')
def download_and_remove(filename):
    path = os.path.join(current_app.instance_path, filename)

    def generate():
        with open(path) as f:
            yield from f

        os.remove(path)

    r = current_app.response_class(generate(), mimetype="text/csv")
    r.headers.set('Content-Disposition', 'attachment', filename="data.csv")
    return r

Leave a Comment