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