如何在页面刷新后终止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
相关产品推荐
相关产品推荐

