debug为false时不调用flask app.teardown_appcontext [英] Flask app.teardown_appcontext not being called when DEBUG is false

查看:41
本文介绍了debug为false时不调用flask app.teardown_appcontext的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题: 当debug为false时,不会调用flask app.teardown_appcontext。Flask的app.teardown_request工作正常。

背景: 首次发现此问题是因为出现错误(2013,‘查询期间丢失与MySQL服务器的连接’),该错误仅在DEBUG=FALSE时发生

进一步研究后,我意识到这是因为flask_sqlalChemy中的会话没有被正确删除。

def create_app(config_obj):
    app = Flask(__name__)
    env = Environments(app)
    env.from_object(config_obj)

    # init extensions
    SetupLogs(app)
    db.init_app(app)
    api.init_app(app)
    CORS(app)

    # This gets called after each request
    @app.teardown_request
    def teardown_request(response_or_exc):
        db.session.remove()

    # This never gets called after requests only when DEBUG = False!
    @app.teardown_appcontext
    def teardown_appcontext(response_or_exc):
        db.session.remove()

    return app

app = create_app('config')
manager = Manager(app)
migrate = Migrate(app, db)
...

推荐答案

我终于找到问题了,实际上是将flask-script与flask-SqlAlChemical一起使用的副作用。

如果SQLAlChemy是使用init_app实例化的,则如果在作用域会话(在请求中进行)之外执行DB操作,则必须使用app.app_context().ush()。More Details但如果推送应用上下文,则必须手动关闭它,否则它永远不会被拆卸,因此永远不会触发teardown_appcontext。

Flask-Script runs commands inside a flask test context我认为这使应用上下文保持活动状态。

这篇关于debug为false时不调用flask app.teardown_appcontext的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆