为什么我的 Flask 中的“g”对象不提供信息?

问题描述 投票:0回答:1

我今天刚开始学习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”文件中使用它,那么这样做就没有问题。只有当你模块化时。如果我错了请纠正我。我只是根据我的经验猜测。

flask flask-sqlalchemy
1个回答
0
投票
我修复了它,从“handleController”函数获取数据并将其传递到“controller”函数。因为我不想立即调用它,因为我在幕后将其包装在“app_context”中,所以我使用 lambda 传入了一个匿名函数。这使得一切顺利。不完全是我想要的解决方案,但现在就坚持这个。

© www.soinside.com 2019 - 2024. All rights reserved.