2017-08-12 105 views
-1

下面的flask函数和它的装饰器显然会将给定的user_id加载到flask_session中。@ LoginManager.user_loader从哪里获取用户ID?

我想知道这个函数从哪里获取user_id。它来自login_user(电子邮件,'....')方法还是UserMixin类?我在某处读到login_user()从UserMixin调用get_id()或is_active。它是否正确 ?

我想知道这三个(decorator,login_user,UserMixin)是如何相互关联的。

@login_manager.user_loader 
def load_user(id): 
    return User.query.get(int(id) 

回答

0

此回调被用来重新加载从存储在会话中的用户ID的用户对象。

我从Flask-Login的文档找到上面的句子。

您误解了load_user(user_id)的功能。它通过会话中的用户标识加载用户对象,而不是将给定的用户标识加载到会话中。

load_user(user_id)从会话中获取用户标识而不是login_userUserMixin

在浏览Flask-Login的源代码后,login_user函数只能从UserMixin调用is_active

关于装饰之间的关系,login_userUserMixin

首先,你应该定义一个User数据模型继承db.Model(从烧瓶SQLAlchemy的)和UserMixin;

然后使用login_manager.user_loader装饰器注册回调函数,用于从会话中重新加载用户,该会话将用于检查用户是否已登录;

最后,一旦用户通过了身份验证,就可以使用将用户ID插入会话的login_user函数登录它们。

我建议您使用Flask-Security来代替Flask-Login

+0

谢谢stamaimer,这在一定程度上是有帮助的。但是如果@ lm.load_user从会话中加载id,会话从哪里获取id? – Hara

+0

我在最后说过。当你登录用户时使用'login_user'功能。您可以在Flask-Login中查看['login_user'](https://github.com/maxcountryman/flask-login/blob/master/flask_login/utils.py#L127)的源代码。 – stamaimer