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

如何在页面刷新后终止Flask方法的执行

解决Flask中客户端断开后后台循环仍运行的问题

问题根源

你遇到的情况是Flask的同步请求特性导致的:当用户提交上传请求后,服务器会同步执行upload_file里的大循环。即便用户刷新页面断开了原连接,服务器不会主动终止这个循环——因为默认情况下,Flask不会在同步请求过程中检测客户端的连接状态,旧请求的循环会一直跑直到结束。

修复方案

在循环里定期检查客户端是否还保持连接,一旦发现断开就立刻终止循环。我们可以借助Flask底层Werkzeug库的连接状态检测能力来实现。

修改后的完整代码

from flask import Flask, render_template, redirect, request
import time

UPLOAD_FOLDER = 'uploads'

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 

@app.route("/")
def index():
    return render_template("index.html")

@app.route('/upload', methods=['GET','POST'])
def upload_file():
    t = 0
    while t < 10**9:
        print(t)
        t += 1
        
        # 检查客户端是否已断开连接
        try:
            werkzeug_request = request.environ.get('werkzeug.request')
            if werkzeug_request and werkzeug_request.connection.lost():
                print("客户端断开,终止循环")
                break
        except Exception:
            # 兼容不同Werkzeug版本的API差异
            pass
        
        # 加个小延迟,减少CPU占用,同时控制检测频率
        time.sleep(0.001)
    
    return redirect('/')

if __name__ == '__main__':
    app.run(debug=True)

关键细节说明

  • 连接检测:通过request.environ获取Werkzeug的原生请求对象,调用connection.lost()判断客户端是否断开。这个方法能直接检测TCP连接状态。
  • 延迟优化:time.sleep(0.001)既能避免循环把CPU占满,也不会让连接检测的频率过高。
  • 异常处理:不同版本的Werkzeug可能有API差异,加try-except能避免代码崩溃。

这样修改后,用户刷新页面时,服务器会立刻检测到连接断开,终止循环并跳转到首页,不会再让无用的循环在后台消耗资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:36:27