当DEBUG为false时,不会调用Flask app.teardown_appcontext

时间:2018-02-20 17:26:10

标签: python flask flask-sqlalchemy

问题: 当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)
...

1 个答案:

答案 0 :(得分:1)

我终于找到了问题,这实际上是使用Flask-Script和Flask-SqlAlchemy的副作用。

如果使用init_app实例化SQLAlchemy,则必须使用app.app_context()。push(),如果在作用域会话之外执行数据库操作(在请求中生成)。 More Details但是如果推送了应用程序上下文,则必须手动关闭它,否则它将永远不会被拆除,因此永远不会触发teardown_appcontext。

Flask-Script runs commands inside a flask test context我相信它可以让应用程序环境保持活力。