如何阻止 Flask 在调试模式下初始化两次? [复制]

Posted

技术标签:

【中文标题】如何阻止 Flask 在调试模式下初始化两次? [复制]【英文标题】:How to stop Flask from initialising twice in Debug Mode? [duplicate] 【发布时间】:2012-03-15 23:40:23 【问题描述】:

在 Python 中构建 Flask 服务并设置调试模式时,Flask 服务将初始化两次。当初始化加载缓存等时,这可能需要一段时间。在开发(调试)模式下必须这样做两次很烦人。当 debug 关闭时,Flask 服务只初始化一次。

如何阻止 Flask 在调试模式下初始化两次?

【问题讨论】:

【参考方案1】:

这里最简单的做法是将use_reloader=False 添加到您对app.run 的调用中 - 即:app.run(debug=True, use_reloader=False)

或者,您可以检查环境中WERKZEUG_RUN_MAIN 的值:

if os.environ.get("WERKZEUG_RUN_MAIN") == "true":
    # The reloader has already run - do what you want to do here

但是,当您希望行为在加载过程中的任何时间除了发生时,条件会更加复杂:

if not app.debug or os.environ.get("WERKZEUG_RUN_MAIN") == "true":
    # The app is not in debug mode or we are in the reloaded process

【讨论】:

你怎么能仍然使用重新加载器,但某些东西只初始化一次? @osa - 我添加了一个可能让您使用重新加载器的替代方案的简要说明 use_reloader=False 非常适合我。 这个答案意味着没有解决方案,只有解决方法?禁用重新加载器通常不是可接受的折衷方案。 我发现了一个极端情况,似乎使用 FLASK_ENV=development 确实 notadd.debug 设置为 true。最后我使用if not (app.debug or os.environ.get("FLASK_ENV") == "development") or os.environ.get("WERKZEUG_RUN_MAIN") == "true":。祝你好运,在 6 个月内解决这个问题......【参考方案2】:

你可以使用before_first_request钩子:

@app.before_first_request
def initialize():
    print "Called only once, when the first request comes in"

【讨论】:

谢谢亚历克斯,但如果我正在做缓存预热或预填充诸如“分类器”之类的东西,这将在第一个请求之前被调用,从而使第一个请求变慢或在烧瓶服务启动时。跨度> 投反对票。当应用重新加载时,before_first_request 将在随后的第一个请求之后再次调用。

以上是关于如何阻止 Flask 在调试模式下初始化两次? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

flask的debug模式下,网页输入pin码进行调试

python web开发-flask调试模式

Flask 学习-9. 开启调试模式(debug模式)的2种方法

flask开启调试的四种模式

TCP 两次握手为什么无法阻止历史连接?

TCP 两次握手为什么无法阻止历史连接?