为什么运行Flask dev服务器运行两次?

我正在使用Flask开发一个网站,而在开发中,我使用以下文件运行烧瓶:

#!/usr/bin/env python from datetime import datetime from app import app import config if __name__ == '__main__': print '################### Restarting @', datetime.utcnow(), '###################' app.run(port=4004, debug=config.DEBUG, host='0.0.0.0') 

当我启动服务器或由于文件已更新而自动重新启动时,它总是显示两行的打印行:

 ################### Restarting @ 2014-08-26 10:51:49.167062 ################### ################### Restarting @ 2014-08-26 10:51:49.607096 ################### 

虽然这不是一个真正的问题(其余部分按预期工作),但我只是想知道为什么它会这样呢? 有任何想法吗?

Werkzeug重载程序产生一个subprocess,以便每次代码更改时重新启动该进程。 Werkzeug是在调用app.run()时为开发服务器提供Flask的库。

请参阅restart_with_reloader()函数代码 ; 你的脚本再次运行subprocess.call()

如果将use_reloader设置为False ,则会看到行为消失,但是也会丢失重新加载function:

 app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False) 

您也可以在使用flask run命令时禁用重载器:

 FLASK_DEBUG=1 flask run --no-reload 

如果您想要检测何时处于重新加载subprocess中,可以查找WERKZEUG_RUN_MAIN环境variables:

 import os if os.environ.get('WERKZEUG_RUN_MAIN') == 'true': print '################### Restarting @ {} ###################'.format( datetime.utcnow()) 

但是,如果您需要设置模块全局variables,则应该在函数上使用@app.before_first_request修饰符 ,并让该函数设置这样的全局variables。 在第一次请求进入时,每次重新加载后都会调用一次:

 @app.before_first_request def before_first_request(): print '########### Restarted, first request @ {} ############'.format( datetime.utcnow()) 

请注意,如果在使用分叉或新子stream程处理请求的全尺寸WSGI服务器中运行此操作,则可能会为每个新子stream程调用before_first_request处理程序。

我有同样的问题,我通过将app.debug设置为False来解决它。 设置为True导致我的__name__ == "__main__"被调用两次。

(我会发布这个作为一个评论,但我没有足够的代表。发表作为答案,希望它可以帮助别人)

如果您使用的是现代flask run命令,则不会使用app.run的选项。 要完全禁用reloader,请传递--no-reload

 FLASK_DEBUG=1 flask run --no-reload 

另外, __name__ == '__main__'永远不会是真的,因为应用程序不是直接执行的。 除非没有__main__块,否则请使用Martijn答案中的相同想法。

 if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': # do something only once, before the reloader if os.environ.get('WERKZEUG_RUN_MAIN') == 'true': # do something each reload