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

Flask调试模式下checkRouter函数重复调用问题求助

问题排查与解决思路

核心原因:Flask调试模式的重载机制

Flask默认开启调试模式时,Werkzeug开发服务器会启动两个进程:主进程负责监听文件变化,子进程处理请求。如果你的checkRouter()函数是在全局代码中直接调用的(而非路由或特定钩子内),两个进程都会执行这段代码,导致日志重复打印。

具体解决方案

1. 关闭调试模式(临时测试)

启动Flask时关闭调试模式,避免双进程触发重复执行:

if __name__ == '__main__':
    app.run(debug=False)

执行sudo python3 app.py后观察日志是否还重复输出。

2. 限制初始化代码仅在主进程执行

如果需要保留调试模式,可通过Werkzeug的环境变量判断,让初始化代码只在主进程运行:

import os
from flask import Flask

app = Flask(__name__)

def checkRouter():
    print("Initial router check")
    print("switchCheck on")

# 仅主进程执行初始化逻辑
if os.environ.get('WERKZEUG_RUN_MAIN') != 'true':
    checkRouter()

@app.route('/')
def index():
    return "Service running"

if __name__ == '__main__':
    app.run(debug=True)

3. 使用Flask启动钩子控制执行时机

将初始化逻辑放到Flask的请求钩子中,确保仅在首次请求时执行一次:

from flask import Flask

app = Flask(__name__)
initialized = False

def checkRouter():
    print("Initial router check")
    print("switchCheck on")

@app.before_request
def init_on_first_request():
    global initialized
    if not initialized:
        checkRouter()
        initialized = True

@app.route('/')
def index():
    return "Service running"

if __name__ == '__main__':
    app.run(debug=True)

额外注意点

  • 原脚本的pause()是阻塞主线程,而Flask启动后会进入事件循环,无需手动阻塞。
  • 确保sudo python3 app.py命令正确执行,buttonshim的权限需求不会引发额外的异常触发逻辑。

内容的提问来源于stack exchange,提问作者Beefcake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:55:22