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

2024-12-03 08:44:00
admin
原创
174
摘要:问题描述:我正在使用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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用