Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么运行Flask dev服务器会自动运行两次?_Python_Flask - Fatal编程技术网

Python 为什么运行Flask dev服务器会自动运行两次?

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

我正在使用开发网站,在开发过程中,我使用以下文件运行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是在调用
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:我不会称它为“内部”,它是一个。然而,这是在我写下这个答案后添加的。我会更新的。