Flask 提供文件后删除文件
Posted
技术标签:
【中文标题】Flask 提供文件后删除文件【英文标题】:Remove file after Flask serves it 【发布时间】:2017-04-12 16:48:53 【问题描述】:我有一个 Flask 视图,它生成数据并使用 Pandas 将其保存为 CSV 文件,然后显示数据。第二个视图为生成的文件提供服务。我想在下载文件后删除它。我当前的代码引发了权限错误,可能是因为after_request
在使用send_from_directory
提供文件之前删除了该文件。送达后如何删除文件?
def process_data(data)
tempname = str(uuid4()) + '.csv'
data['text'].to_csv('samo/static/temp/'.format(tempname))
return file
@projects.route('/getcsv/<file>')
def getcsv(file):
@after_this_request
def cleanup(response):
os.remove('samo/static/temp/' + file)
return response
return send_from_directory(directory=cwd + '/samo/static/temp/', filename=file, as_attachment=True)
【问题讨论】:
【参考方案1】:after_request
在视图返回之后但在响应发送之前运行。发送文件可能会使用流式响应;如果您在完全阅读之前删除它,您可能会遇到错误。
这主要是 Windows 上的问题,其他平台可以将文件标记为已删除并保留它直到它不被访问。但是,无论平台如何,仅在确定文件已发送后才删除文件可能仍然有用。
将文件读入内存并提供服务,这样您以后删除它时就不会读取它。如果文件太大而无法读入内存,请使用生成器提供服务然后将其删除。
@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
【讨论】:
以上是关于Flask 提供文件后删除文件的主要内容,如果未能解决你的问题,请参考以下文章
删除数据库文件和sqllocaldb后,底层提供程序在Open上失败