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

标签 python flask

我正在使用 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/25504149/

相关文章:

python - Python中PERT分布的随机值

python - 如何设计和设置用户和角色表以从两者检索值?

mysql - Flask,尝试从 mysql 数据库读取数据(并非所有参数在字符串格式化期间都转换)

python - flask-httpauth 上的多个 verify_password 回调

python - 我如何将Django与Parcel结合起来?

python - 如何删除字典字典中的所有大括号

python - 在 PyGTK 中,显示 PNG 文件的简单方法是什么?

python - flask jsonify : key starting with digit

python - 操作系统错误 : [Errno 98] Address already in use Running Flask Application on Apache2

使用 Flask 的 Nginx RTMP