From cb5baf809e2fd33ee838bc7580c53eac84b1f6a2 Mon Sep 17 00:00:00 2001 From: hjq <770690987@qq.com> Date: Fri, 12 Jun 2026 16:13:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=93=E5=8F=96=E7=94=9F=E4=BA=A7=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=EF=BC=8C=E6=8A=93=E5=8F=96=E5=8F=91=E6=96=99=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web_ui/app.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/web_ui/app.py b/web_ui/app.py index f44b2da..6be9777 100644 --- a/web_ui/app.py +++ b/web_ui/app.py @@ -1217,15 +1217,13 @@ def find_free_port(start_port=5050, max_port=5100): return s.getsockname()[1] if __name__ == '__main__': - # 智能判断:如果是通过 PyInstaller 打包运行的,或者是 Werkzeug 重载进程,则控制浏览器打开行为 - is_frozen = getattr(sys, 'frozen', False) - # 当 Werkzeug (Flask内置服务器) 使用热加载时,它会启动一个监控主进程和一个运行子进程。 - # 子进程会有 WERKZEUG_RUN_MAIN 这个环境变量。 - is_werkzeug_reloader = os.environ.get('WERKZEUG_RUN_MAIN') == 'true' + # 这里是专门给开发环境(python app.py)使用的 + # 生产环境 Gunicorn 不会执行这部分代码,而是直接导入 app 变量 - # 只有在不需要热加载,或者是热加载的真正工作子进程中,才去寻找端口并打开浏览器 - if is_frozen or not app.debug or is_werkzeug_reloader: - # 动态获取一个可用端口 + # 检测是否是通过 PyInstaller 打包运行 + is_frozen = getattr(sys, 'frozen', False) + + if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': try: port = find_free_port() except Exception as e: @@ -1236,16 +1234,13 @@ if __name__ == '__main__': threading.Thread(target=open_browser, args=(port,), daemon=True).start() print("🚀 前端展示后端服务已启动!") print(f"👉 本机访问地址: http://127.0.0.1:{port}") - print(f"👉 局域网访问地址: http://192.168.7.198:{port} (允许手机/其他电脑访问)") else: - # 如果是热加载的主控进程,随便给个默认端口(反正它不干活),并且不打开浏览器 port = 5050 - # 更改为动态端口,避开被占用的端口。修改 host 为 0.0.0.0 允许局域网访问 app.run( debug=not is_frozen, host='0.0.0.0', port=port, threaded=True, - use_reloader=False # 彻底关闭 Flask 内置的热加载,避免双进程互相影响 + use_reloader=False ) \ No newline at end of file