当前位置: 首页 > 知识库问答 >
问题:

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

益富
2023-03-14

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

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

共有3个答案

艾飞宇
2023-03-14

我也有同样的问题,我通过设置app解决了这个问题。调试到False。将其设置为True会导致调用我的\uu name\u==“\ uu main\uu”。

段晨
2023-03-14

如果您使用的是现代的“烧瓶运行”命令,则没有应用程序的选项。运行。要完全禁用重新加载程序,请通过“无重新加载”:

FLASK_DEBUG=1 flask run --no-reload

此外,由于应用程序不是直接执行的,因此,\uu name\uu==“\ uu main\uu”永远不会为真。使用Martijn答案中的相同想法,除了没有\uu main\u块。

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
阮鸿煊
2023-03-14

Werkzeug重载程序生成一个子进程,以便在每次代码更改时重新启动该进程。Werkzeug是一个库,当你调用app时,它为Flask提供开发服务器。run()。

请参阅功能代码;使用子进程再次运行脚本。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函数:

from werkzeug.serving import is_running_from_reloader

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

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

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

一定要考虑到,如果在使用分叉或新子进程处理请求的全规模WSGI服务器中运行此操作,则可以为每个新子进程调用before\u first\u request处理程序

 类似资料:
  • 问题内容: 我正在设置一个简单的图像:包含Riak(一个NoSQL数据库)的图像。该映像以CMD形式启动Riak服务。现在,如果我使用将该程序作为守护程序运行,它将启动Riak进程(我可以在日志中看到它)。但是,它会在几秒钟后自动关闭。如果我使用riak进程未启动运行它(更新:对此的解释,请参见答案)。实际上,根本没有任何服务在运行。我可以使用终端手动启动它,但是我希望Riak自动启动。我认为其他

  • 问题内容: 当我尝试检入机器B时,我正在从机器A运行python manage.py runserver。我键入的URL是http:// A:8000 / 我收到类似系统返回的错误:(111)连接被拒绝 问题答案: 你可以通过以下方式为网络中的计算机运行它 这样一来,你就可以从网络中的任何计算机访问服务器。只需在浏览器中的其他机器上键入你服务器的IP地址…就可以开始使用…了。 或者在你的情况下:

  • 我有一个Dockerfile来在容器中安装MySQL server,然后我这样开始: 但MySQL服务不会自动启动,我必须手动运行(从容器内): 如何在运行docker容器时自动启动MySQL服务?

  • 问题内容: 我有一个Dockerfile将MySQL服务器安装在一个容器中,然后我开始像这样: 但是MySQL服务不会自动启动,我必须手动运行(从容器内部): 运行docker容器时如何自动启动MySQL服务? 问题答案: 首先,有一个 问题, 在您的: Docker映像不会保存正在运行的进程。因此,您的命令仅在阶段执行,并在构建完成后停止。相反,您需要使用或如下所示的命令在启动容器时指定命令:

  • 我使用的是Tomcat服务器V7.0。我需要在同一台机器上同时运行两个Tomcat服务器。在运行第一个Tomcat服务器并尝试运行第二个Tomcat服务器后,出现了这个错误。 有解决办法吗? 谢谢你。

  • 简述 Swoft 拥有便捷的命令行工具和相应的服务管理命令,参阅 Swoft Devtool 了解更多。 HTTP 服务 # 启动 HTTP 服务 $ php ./bin/swoft http:start # 以守护进程模式启动 $ php ./bin/swoft http:start -d # 重启 HTTP 服务 $ php ./bin/swoft http:restart # 重新加载