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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:09:00