Flask如何仅对特定路由'/data_extractor_export'触发after_request方法
解决方案
以下两种方案都可以实现仅在指定路由触发后置清理逻辑的需求:
方案1:在蓝图after_request中添加路由校验
适合多个路由需要复用同一段后置逻辑的场景,仅需给现有post_process函数新增路由匹配判断即可:
@dataextractorController.after_request def post_process(response): # 仅命中目标路由时才执行清理,判断规则二选一即可 # 规则1:匹配请求路径,注意如果蓝图配置了url_prefix需要拼接前缀 # if request.path == '/data_extractor_export': # 规则2:匹配路由端点,格式为「蓝图名.视图函数名」,不受路径配置影响更稳定 if request.endpoint == 'dataextractorController.export': dir = '../WEB_Data/data/Dataset_Upload/' for f in os.listdir(dir): if '.zip' in str(f): os.remove(os.path.join(dir, f)) return response
方案2:使用after_this_request绑定单请求后置逻辑(更推荐)
如果只有export接口需要执行清理逻辑,更建议用Flask内置的after_this_request装饰器,直接把清理逻辑和当前请求绑定,完全不会触发其他路由的后置操作:
首先导入依赖:
from flask import after_this_request
修改后的视图函数如下:
@dataextractorController.route('/data_extractor_export', methods=['GET', 'POST']) def export(): try: file_name = request.form.get('file_name') file_path = '../MT_Data/Dataset_Download/Data-Extractor/' + str(file_name) + '/' file_temp_download = '../WEB_Data/data/Dataset_Upload/' + str(file_name) target_zip_path = file_temp_download + '.zip' shutil.make_archive(file_temp_download, 'zip', file_path) print('Y') # 定义仅当前请求结束后执行的清理逻辑 @after_this_request def remove_temp_zip(response): # 优化:仅删除当前请求生成的zip,避免并发场景下误删其他用户的临时文件 if os.path.exists(target_zip_path): os.remove(target_zip_path) return response return send_file(os.path.join(target_zip_path), as_attachment=True) except: e = sys.exc_info()[1] return error_handler(str(e))
优化提示:原清理逻辑会删除目录下所有zip文件,多用户并发导出时可能会删掉其他用户未完成下载的临时文件,上述方案2中已经改为仅删除当前请求生成的指定文件,逻辑更安全。
内容的提问来源于stack exchange,提问作者newprogrammer23
相关产品推荐
相关产品推荐

