You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:57:04