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

Flask @after_this_request未被访问 生成文件提前删除无法展示问题求助

问题根因
  • IDE未访问提示属于误报
    你将@after_this_request装饰的回调函数定义在了if 'Alpha Miner' in request.form分支内部,IDE静态代码扫描无法识别Flask的回调注册逻辑,所以会判定函数未被调用,该提示不影响实际运行,可直接忽略。
  • 文件提前删除属于核心逻辑错误
    @after_this_request的触发时机是当前/路由请求处理完成后立刻执行,你当前请求返回的是包含svg链接的HTML页面,触发回调时直接删除了svg文件。等浏览器收到HTML后再发起svg静态资源请求时,文件已经被删除,自然加载失败。

另外你的代码还存在两个显性bug:

  1. os.remove(img_url)逻辑错误:img_url是web访问的URL路径,不是本地文件的物理存储路径,直接删除URL字符串会抛出文件不存在异常
  2. 变量名拼写错误:你定义的变量是titel,传递给模板的参数是title,会导致模板变量不存在报错

修复方案

方案一:内嵌svg资源(最稳妥,无额外依赖)

直接将svg文件内容读取后嵌入到HTML中,无需浏览器再发起额外的静态资源请求,当前请求返回后即可安全删除文件。
修改后代码示例:

@app.route('/', methods=['POST', 'GET'])
def upload_file():
    if request.method == 'POST':
        myuuid = uuid.uuid4()
        # check if the post request has the file part
        if 'file' not in request.files:
            return render_template('error.html')
        file = request.files['file']
        # If the user does not select a file, the browser submits an
        # empty file without a filename.
        if file.filename == '':
            return render_template('error.html')

        if file and allowed_file(file.filename):
            sfilename = secure_filename(file.filename)
            if not os.path.exists(app.config['UPLOAD_FOLDER']):
                os.mkdir(app.config['UPLOAD_FOLDER'])
            output_path = os.path.join(app.config['UPLOAD_FOLDER'], sfilename)
            file.save(output_path)

            if 'Alpha Miner' in request.form:
                Alpha(pro_file, myuuid)
                # 计算svg本地物理路径
                svg_local_path = os.path.join(app.static_folder, f"{myuuid}.gv.svg")
                # 读取svg内容
                with open(svg_local_path, 'r', encoding='utf-8') as f:
                    svg_content = f.read()
                
                @after_this_request
                def remove_file(response):
                    # 删除本地物理路径,不要删除URL
                    if os.path.exists(svg_local_path):
                        os.remove(svg_local_path)
                    return response
              
                title = "Petri Net for Alpha Miner: " + sfilename    
                # 把svg内容传给模板,不用传url
                return render_template('upload.html', svg_content=svg_content, title=title)

然后修改upload.html模板,把原来的<img src="{{ img_url }}">标签替换为直接渲染svg内容:

{{ svg_content|safe }}

方案二:定时清理过期文件

如果需要保留svg单独访问的逻辑,可以废弃after_this_request的清理逻辑,改为每次生成新文件时,清理静态目录下超过5分钟的旧svg文件即可,给用户留出足够的加载时间:

import time

# 新增清理函数
def clean_expired_svgs():
    static_dir = app.static_folder
    now = time.time()
    for filename in os.listdir(static_dir):
        if filename.endswith('.gv.svg'):
            file_path = os.path.join(static_dir, filename)
            # 清理超过5分钟的文件
            if os.path.getmtime(file_path) < now - 300:
                os.remove(file_path)

在调用Alpha生成文件前调用清理函数即可:

if 'Alpha Miner' in request.form:
    clean_expired_svgs()
    Alpha(pro_file, myuuid)
    # 后续直接返回url即可,不用加删除回调

内容的提问来源于stack exchange,提问作者icbidt1018

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:27:03