问题: 当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)
...
答案 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我相信它可以让应用程序环境保持活力。