基于Flask开发时如何在浏览器标签关闭时触发Python函数关停服务
Flask实现本地GUI应用启停方案
1. 启动时自动打开浏览器
实现逻辑很简单,单独开一个线程延迟启动浏览器,避免Flask服务还没初始化完成导致页面访问失败。
示例代码如下:
from flask import Flask, request import webbrowser import threading import time import os app = Flask(__name__) # 业务路由示例 @app.route('/') def index(): # 这里返回你的GUI前端页面 return ''' <!DOCTYPE html> <html> <body> <h1>你的应用界面</h1> <script> // 关停逻辑的JS会放在这里 </script> </body> </html> ''' def open_browser(): # 等待1秒确保Flask服务启动完成 time.sleep(1) webbrowser.open_new("http://127.0.0.1:5000/") if __name__ == '__main__': # 启动浏览器线程 threading.Thread(target=open_browser, daemon=True).start() # *注意:debug模式必须关闭,否则Flask的自动重载机制会触发两次浏览器打开逻辑 app.run(debug=False, host="127.0.0.1", port=5000)
2. 关闭标签页时自动关停Flask服务
实现逻辑是前端监听页面卸载事件,给后端发送关停请求,后端收到本地发来的请求后直接终止进程即可。
前端代码(插入到你的页面JS逻辑中)
// 可选:配置正常操作不触发关停,避免页面刷新、站内跳转时误关服务 let allowShutdown = true; // 示例:点击站内链接时标记为正常操作 document.querySelectorAll('a[href^="/"]').forEach(el => { el.addEventListener('click', () => allowShutdown = false); }); // 示例:表单提交时标记为正常操作 document.querySelectorAll('form').forEach(el => { el.addEventListener('submit', () => allowShutdown = false); }); // 监听页面卸载事件 window.addEventListener('beforeunload', () => { if (allowShutdown) { // 使用sendBeacon保证页面卸载时请求也能正常发送到后端 navigator.sendBeacon('/shutdown'); } });
后端关停路由代码
@app.route('/shutdown', methods=['POST']) def shutdown(): # *注意:必须添加本地IP校验逻辑,避免服务被外部请求恶意关停 if request.remote_addr != '127.0.0.1': return "无权操作", 403 # 开延迟线程关停,确保先给前端返回响应 def _shutdown(): time.sleep(0.1) os._exit(0) threading.Thread(target=_shutdown, daemon=True).start() return "服务关闭中"
打包exe注意事项
使用PyInstaller打包时,推荐使用以下命令:pyinstaller -w -F 你的启动文件名.py
-w:禁用控制台窗口,符合GUI应用的使用体验-F:打包为单个独立exe文件,方便分发
内容的提问来源于stack exchange,提问作者HCook886
相关产品推荐
相关产品推荐

