为什么运行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