如何阻止 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
确实 not 将 add.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 在调试模式下初始化两次? [复制]的主要内容,如果未能解决你的问题,请参考以下文章