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

2024-12-03 08:44:00
admin
原创
172
摘要:问题描述:我正在使用Flask开发网站,在开发过程中我使用以下文件运行 flask:#!/usr/bin/env python from datetime import datetime from app import app import config if __name__ == '__main__':...

问题描述:

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

虽然这实际上不是一个问题(其余部分按预期工作),但我只是想知道为什么它会这样?有什么想法吗?


解决方案 1:

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

查看restart_with_reloader()函数代码;您的脚本将再次运行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函数:

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_first_request处理程序。

解决方案 2:

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

FLASK_DEBUG=1 flask run --no-reload

此外,__name__ == '__main__'永远不会为真,因为应用程序不会直接执行。使用与Martijn 的答案相同的思路,但不使用__main__块。

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

解决方案 3:

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

解决方案 4:

从 Flask 0.11 开始,建议使用flask run而不是来运行你的应用程序python application.py。使用后者可能会导致你的代码运行两次。

如此处所述:

... 从 Flask 0.11 开始,建议使用 flask 方法。这样做的原因是由于重新加载机制的工作方式,会产生一些奇怪的副作用(例如执行某些代码两次...)

解决方案 5:

我正在使用插件 - python-dotenv 并且我会将它放在我的配置文件 - .flaskenv 上:

FLASK_RUN_RELOAD=False

这将避免我运行两次 Flask。

解决方案 6:

我遇到了同样的问题。我通过修改主程序并在其中插入 use_reloader=False 解决了这个问题。如果有人在这里寻找解决此问题的方法,那么下面的代码将帮助您入门,但是,您将删除自动检测代码更改的功能,并且重新启动应用程序将不起作用。每次编辑代码后,您都必须手动停止并重新启动应用程序。

if __name__ == '__main__':
    app.run(debug=True, use_reloader=False)

解决方案 7:

Flask 应用程序自行运行两次的可能原因之一是WEB_CONCURRENCYHeroku 上的设置配置。要设置一个,您可以在控制台中写入
heroku config:set WEB_CONCURRENCY=1

解决方案 8:

我的修复要点是在所有进程之间共享一个 tmp 文件,如果该文件不存在,则开始初始化代码,包括设置调度程序。我尝试过的所有其他建议,要么为了可扩展性而失去子进程的功能,要么在提供的 Flask 调试中自动重新加载。

  import os.path
  from apscheduler.schedulers.background import BackgroundScheduler

  app = Flask(__name__)

  def set_lastrun():
       f = open('/tmp/lastrun','w')
       f.write(f'{datetime.now()}')
       f.close()

  def get_lastrun():
      return os.path.isfile('/tmp/lastrun')

  def start_job_scheduler():
      scheduler = BackgroundScheduler()    
      scheduler.add_job(func=your_job, trigger="interval", seconds=300)
      scheduler.start()

  def app_init():
      if not get_lastrun():
          set_lastrun()
          start_job_scheduler()

  app_init()

`

解决方案 9:

另外四个遇到类似问题的人没有运行 flask,我通过在运行服务器时添加以下参数解决了我的问题:

python manage.py runserver --noreload
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用