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我认为这使应用上下文保持活动状态。
相关文章