我正在使用Flask开发网站,而在开发过程中,我使用以下文件运行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重新加载程序会生成一个子进程,以便每次代码更改时都可以重新启动该进程。Werkzeug是在您调用时向Flask提供开发服务器的库app.run()
。
参见restart_with_reloader()
功能代码; 您的脚本将再次使用运行subprocess.call()
。
如果设置use_reloader
为False
,则行为会消失,但同时也会丢失重新加载功能:
app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)
您也可以在使用flask run
命令时禁用重新加载器:
FLASK_DEBUG=1 flask run --no-reload
WERKZEUG_RUN_MAIN
如果要检测何时处于重装子进程中,可以查找环境变量:
import os
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
print '################### Restarting @ {} ###################'.format(
datetime.utcnow())
但是,如果需要设置模块全局变量,则应该在一个函数上使用@app.before_first_request
装饰器,并让该函数设置此类全局变量。当第一个请求进入时,每次重载后都会调用一次:
@app.before_first_request
def before_first_request():
print '########### Restarted, first request @ {} ############'.format(
datetime.utcnow())
请注意,如果您在使用分叉或新子流程来处理请求的全面WSGI服务器中运行此服务器,则可能会为每个新子流程调用before_first_request
处理程序。
如果使用的是现代flask run
命令,则不使用任何选项app.run
。要完全禁用重新加载器,请传递--no-reload
:
FLASK_DEBUG=1 flask run --no-reload
此外,__name__ == '__main__'
由于应用程序未直接执行,因此永远不会正确。使用Martijn答案中的相同想法,除非没有__main__
障碍。
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
我遇到了同样的问题,并通过设置app.debug
为解决了False
。设置True
为导致我__name__ == "__main__"
被叫两次。
从Flask 0.11开始,建议使用flask run
而不是来运行您的应用python application.py
。使用后者可能会导致您的代码运行两次。
...从Flask 0.11开始,建议使用长瓶法。这样做的原因是,由于重载机制的工作方式,因此会有一些奇怪的副作用(例如两次执行某些代码...)
Flask应用程序本身运行两次的可能原因之一是WEB_CONCURRENCY
在Heroku上进行的配置配置。要设置为一个,可以在控制台中编写
heroku config:set WEB_CONCURRENCY=1
我遇到过同样的问题。我通过修改main并将use_reloader = False插入其中来解决了该问题。如果有人在寻找解决此问题的方法,那么下面的代码将帮助您入门,但是您将无法自动检测到代码更改并重新启动应用程序,因此该功能将不起作用。每次编辑代码后,您都必须手动停止并重新启动应用程序。
if __name__ == '__main__':
app.run(debug=True, use_reloader=False)
文章标签:flask , python
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!