Python 为什么运行Flask dev服务器会自动运行两次?
我正在使用开发网站,在开发过程中,我使用以下文件运行flask:Python 为什么运行Flask dev服务器会自动运行两次?,python,flask,Python,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(por
#!/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是在调用
app.run()
时为Flask提供开发服务器的库
看,;您的脚本将使用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
如果要在重新加载子进程时检测,可以使用:
from werkzeug.serving import is_running_from_reloader
if is_running_from_reloader():
print(f"################### Restarting @ {datetime.utcnow()} ###################")
但是,如果需要设置模块全局变量,则应在函数上使用,并让该函数设置此类全局变量。每次重新加载后,当第一个请求传入时,只调用一次:
@app.before_first_request
def before_first_request():
print(f"########### Restarted, first request @ {datetime.utcnow()} ############")
一定要考虑到,如果您在使用分叉或新子流程处理请求的全面WSGI服务器中运行此操作,那么每个新子流程都可以调用第一个请求之前的
处理程序。我也遇到了同样的问题,我通过将app.debug
设置为False
解决了这个问题。将其设置为True
会导致调用我的\uuuu name\uuuu=“\uuuu main\uuuu”
两次。如果您使用的是现代flask run
命令,则不会使用app.run
的任何选项。要完全禁用重新加载程序,请通过--无重新加载
:
FLASK_DEBUG=1 flask run --no-reload
另外,\uuuuuu name\uuuuu='\ uuuuuu main\uuuuu'
将永远不会为真,因为应用程序不会直接执行。除了没有\uuu main\uuu
块之外,请使用来自的相同想法
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
我也有同样的问题。我通过修改main并在其中插入use_reloader=False解决了这个问题。如果有人在这里寻找解决此问题的方法,那么下面的代码将帮助您开始,但是,您将删除自动检测到的代码更改功能,并且重新启动应用程序将不起作用。每次在代码中编辑后,您必须手动停止并重新启动应用程序
如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
运行(debug=True,use_reloader=False)
Flask应用程序自身运行两次的可能原因之一是Heroku上的WEB\u并发设置。要设置为一个,您可以在控制台中编写
heroku config:set WEB\u CONCURRENCY=1
从Flask 0.11开始,建议使用Flask run
运行应用程序,而不是python application.py
。使用后者可能会导致代码运行两次
:
。。。从烧瓶0.11开始,建议使用烧瓶法。原因是,由于重载机制的工作方式,存在一些奇怪的副作用(例如,执行某些代码两次…)
我正在使用plugin-pythondotenv
我将把它放在我的配置文件-.flaskenv中:
FLASK\u RUN\u RELOAD=False
这将避免flask为我运行两次。My\uuuu main\uuuuuuuuu
仍然使用app.debug=False
和app.run\u服务器(debug=False)
运行两次。你确定这是为你做的,或者你能发布一些可复制的代码来尝试吗?改变app.debug是我为我解决它所做的一切。当flask服务器启动时,您能否确认main仅运行两次?尝试运行一个最小的工作示例,看看是否出现问题。还可以尝试运行一个在多个python版本中失败的最小示例,这可能是一个问题。我已经将我的项目迁移到Java和SparkJava,而不是python和flask,所以我不记得是什么解决了这个问题。我正在通过plotly dash
使用flask
,发现他们最近将debug
参数传递到flask
。我猜我在上面搞错了,可能是做了app.debug=False
(这可能被默认参数覆盖为run\u server
),或者只是在没有传递True
的情况下进行了尝试,而没有如上所示的显式设置。现在这对我来说工作正常(请确保debug=False
)。谢谢Werkzeug还有一个内部方法来检查它是否在重新装载机中运行。它被称为werkzeug.serving.is_running_from_reloader
,它基本上返回相同的结果,但可读性更强。@VaclavPelc:我不会称它为“内部”,它是一个。然而,这是在我写下这个答案后添加的。我会更新的。