如何实现关闭Webview时自动终止Flask服务
解决关闭WebView时自动终止Flask服务的问题
原代码中WebView窗口关闭后,Flask服务会持续运行,原因是app.run()为阻塞式执行,且没有触发服务停止的逻辑。以下是修复后的完整代码:
from tkinter import * from threading import Thread from flask import Flask, render_template, request import webview import requests app = Flask(__name__) tk = Tk() tk.geometry("800x450") webview.create_window('TITLE', 'http://127.0.0.1:5000/') @app.route('/') def hello_world(): return render_template('index.html', message='Hello, World!') @app.route('/shutdown', methods=['POST']) def shutdown(): # 调用Werkzeug内置方法终止服务器 func = request.environ.get('werkzeug.server.shutdown') if func: func() return "Server shutting down..." def run_flask_app(): # 关闭自动重载,避免生成额外进程导致无法彻底终止 app.run(use_reloader=False) def main(): flask_thread = Thread(target=run_flask_app) flask_thread.start() # webview.start()会阻塞执行,直到窗口被关闭 webview.start() # 窗口关闭后,发送请求终止Flask服务 try: requests.post('http://127.0.0.1:5000/shutdown') except requests.exceptions.ConnectionError: # 服务已关闭时忽略连接异常 pass flask_thread.join() if __name__ == "__main__": main()
关键修改说明
- 新增
/shutdown路由:借助Werkzeug框架提供的werkzeug.server.shutdown方法,接收请求后直接终止Flask服务 - 关闭Flask自动重载:启动服务时添加
use_reloader=False,防止自动重载机制创建额外进程,导致服务无法彻底停止 - 窗口关闭触发终止:
webview.start()执行完成代表窗口已关闭,此时发送POST请求到/shutdown路由,主动停止Flask服务 - 异常捕获:处理连接错误,避免服务已经关闭时抛出不必要的异常
内容的提问来源于stack exchange,提问作者zanlantic rzeno
相关产品推荐
相关产品推荐

