Flask投放后删除文件
问题内容:
我有一个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)
问题答案:
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