我今天刚开始学习Flask。我正在努力遵循最佳实践。因此,我将用户数据添加到 Flask 中的“g”对象中。一开始效果很好。
@some_blueprint.before_request
def handleAuthentication():
# Do some auth logic
# Add user data to Flask "g" object
g.user = {userId: 'somevalue'}
print(g.get('user')) # PRINTS OUT USER DATA
它也在路由处理程序内部工作
@some_blueprint.route("/some-route", methods=['GET'])
def handleController():
print(g.get('user')) # PRINTS OUT USER DATA
return controller()
但由于某种原因,它无法在路由处理程序内部调用的控制器内部工作。
def controller():
print(g.get('user')) # DOES NOT PRINT OUT USER DATA
# Some Logic
如何让控制器能够访问“authentication”和“handleController”方法所具有的相同数据?
此外,我之前确实遇到了一个问题,当我使用
db.sesssion.add
和 db.session.commit
方法时,他们给了我一个错误,内容是“当前的 Flask 应用程序未在此 'SQLAlchemy' 实例中注册。您是否忘记调用 'init_app ',或者您是否创建了多个“SQLAlchemy”实例,我通过使用此代码包装我的控制器来修复它。
with app.app_context():
# NOW DB.SESSION.ADD AND DB.SESSION.COMMIT WORKS
虽然现在可以了,但我不太明白为什么?我的猜测是,当您模块化 Python 代码(将其分解为多个部分以使其更易于导航)时,SQLAlchemy 无法识别有关数据库的信息。因为如果您在“app.py”文件中使用它,那么这样做就没有问题。只有当你模块化时。如果我错了请纠正我。我只是根据我的经验猜测。