gpt4 book ai didi

python - 为什么运行 Flask 开发服务器会自行运行两次?

转载 作者:太空宇宙 更新时间:2023-11-03 20:24:02 25 4
gpt4 key购买 nike

我正在使用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 是当您调用 app.run() 时为 Flask 提供开发服务器的库。

请参阅restart_with_reloader() function code ;您的脚本使用 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.serving.is_running_from_reloader function如果您想检测何时处于重新加载子进程中:

from werkzeug.serving import is_running_from_reloader

if is_running_from_reloader():
print(f"################### Restarting @ {datetime.utcnow()} ###################")

但是,如果您需要设置模块全局变量,那么您应该使用 @app.before_first_request decorator在一个函数上并让该函数设置这样的全局变量。当第一个请求到来时,它会在每次重新加载后被调用一次:

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

请务必考虑到,如果您在使用 fork 或新子进程来处理请求的完整 WSGI 服务器中运行此程序,则可能会调用 before_first_request 处理程序每个新的子流程。

关于python - 为什么运行 Flask 开发服务器会自行运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57960460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com