首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么运行Flask dev服务器会自己运行两次?

为什么运行Flask dev服务器会自己运行两次?
EN

Stack Overflow用户
提问于 2014-08-26 18:58:15
回答 5查看 41.3K关注 0票数 137

我正在使用Flask开发一个网站,在开发过程中,我使用以下文件运行flask:

代码语言:javascript
复制
#!/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')

当我启动服务器时,或者当它因为文件被更新而自动重启时,它总是显示两次打印行:

代码语言:javascript
复制
################### Restarting @ 2014-08-26 10:51:49.167062 ###################
################### Restarting @ 2014-08-26 10:51:49.607096 ###################

虽然这不是一个真正的问题(其余的工作如预期),但我只是想知道为什么它会表现成这样?有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-08-26 19:00:27

Werkzeug重载器会派生一个子进程,这样每次代码更改时它都可以重新启动该进程。当您调用app.run()时,Werkzeug是为Flask提供开发服务器的库。

请参阅restart_with_reloader() function code;使用subprocess.call()再次运行您的脚本。

如果您将use_reloader设置为False,您将看到该行为消失,但随后您也会失去重新加载功能:

代码语言:javascript
复制
app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)

您也可以在使用flask run命令时禁用重载程序:

代码语言:javascript
复制
FLASK_DEBUG=1 flask run --no-reload

如果您想要检测何时处于重新加载子进程中,可以使用werkzeug.serving.is_running_from_reloader function

代码语言:javascript
复制
from werkzeug.serving import is_running_from_reloader

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

但是,如果您需要设置模块全局变量,则应该在函数上使用@app.before_first_request decorator,并让该函数设置此类全局变量。

代码语言:javascript
复制
@app.before_first_request
def before_first_request():
    print(f"########### Restarted, first request @ {datetime.utcnow()} ############")

一定要考虑到,如果您在使用forking或新子流程来处理请求的全规模WSGI服务器中运行此服务,则可能会为每个新子流程调用before_first_request处理程序。

票数 196
EN

Stack Overflow用户

发布于 2017-11-12 22:49:09

如果使用的是现代的flask run命令,则不会使用app.run的任何选项。要完全禁用重载程序,请传递--no-reload

代码语言:javascript
复制
FLASK_DEBUG=1 flask run --no-reload

此外,__name__ == '__main__'永远不会是真的,因为应用程序不是直接执行的。除了没有__main__块之外,使用与Martijn's answer相同的想法。

代码语言:javascript
复制
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
票数 16
EN

Stack Overflow用户

发布于 2016-12-15 02:47:36

我也遇到了同样的问题,我通过将app.debug设置为False解决了这个问题。将它设置为True会导致我的__name__ == "__main__"被调用两次。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25504149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档