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

2020/11/30 23:31 · python ·  · 0评论

我正在使用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是在您调用时向Flask提供开发服务器的库app.run()

参见restart_with_reloader()功能代码; 您的脚本将再次使用运行subprocess.call()

如果设置use_reloaderFalse,则行为会消失,但同时也会丢失重新加载功能:

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_RUN_MAIN如果要检测何时处于重装子进程中,可以查找环境变量:

import os
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
    print '################### Restarting @ {} ###################'.format(
        datetime.utcnow())

但是,如果需要设置模块全局变量,则应该在一个函数上使用@app.before_first_request装饰器,并让该函数设置此类全局变量。当第一个请求进入时,每次重载后都会调用一次:

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

请注意,如果您在使用分叉或新子流程来处理请求的全面WSGI服务器中运行此服务器,则可能会为每个新子流程调用before_first_request处理程序

如果使用的是现代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

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

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

如此处所述

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

Flask应用程序本身运行两次的可能原因之一是WEB_CONCURRENCY在Heroku上进行的配置配置要设置为一个,可以在控制台中编写
heroku config:set WEB_CONCURRENCY=1

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

if __name__ == '__main__':
    app.run(debug=True, use_reloader=False)
本文地址:http://python.askforanswer.com/weishenmeyunxingflaskkaifafuwuqihuizishenyunxingliangci.html
文章标签: ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!