一、前言
用户登录后,验证状态需要记录在会话中,这样浏览不同页面时才能记住这个状态,Flask_Login是Flask的扩展,专门用于管理用户身份验证系统中的验证状态。
注:Flask是一个微框架,仅提供包含基本服务的核心(路由、网关接口、模板),其它功能都是通过扩展来实现,它有无数扩展,你可以根据需要自由组合,这一系列文章我们会来介绍一下这些扩展的使用以及解读一下其源码,另外关于分布系统登录方案可以参考 《Session、Token、Jwt三种登录方案介绍》。
二、登录认证主要代码
pip install flask-login
1、模型中定义User对象
注:User对象继承UserMixin
注:配置user_loader,用于被回调。
2、初始化flask-login
初始化Login_manager对象,并且设置登录页面地址,这样当匿名用户访问时会重定向到登录页。
3、登录
注:调用login_manager 的login_user方法进行登录。
4、接口拦截
注:相当于一个拦截器,当匿名用户调用配置了装饰器的该接口后会被重定向到登录页。
三、flask-login源码分析
1、UserMixin
注:User模型继承自UserMixin,它提供了缺省配置实现,可以满足大多数场景的需求。
2、登录
关键代码调用flask_login中的login_manager.login_user(user,form.remember_me.data)
注:构建session对象,包括sessionid以及user_id(用户表主键),其中sessionid是调用utils.py _create_identifier生成。
注:这样生成的sessionid只要user-agent和IP相同就是一样的????
remember保持登录状态,每次重新登录会往后延。
current_app.login_manager._update_request_context_with_user(user)
注:将User对象存储到当前的request_context中。
user_logged_in.send(current_app._get_current_object(), user=_get_user())
user_logged_in是flask_login定义的Signals,这里将user对象为信号传递给相应的回调函数。
3、拦截
@require_login 装饰器
注:如果当前用户 is_authenticated为True则正常处理请求,否则进入login_manager.
unauthorized()的处理流程(重定向到登录页,登录后跳回本地址)
current_user的定义
注:current_user通过_get_user()来获取用户,一般会返回要么是正常用户(签权成功),要么是匿名用户(签权失败)。
注:如果用户登录后,会将user存储在当前request_context中,我们就可以直接获取,如果request_context中没有user对象,将调用_load_user()来恢复(服务器重启就会走这个路径,浏览器并不需要重新登录)
如果session中还有user_id,通过id调用 user_loade装饰器加载用户,如果没有id则通过remeber cookie、request、request header依次尝试去加载用户。文章来源:https://www.toymoban.com/news/detail-736453.html
注:源码中关于回调那块用了Python的Signals机制(信号机制)这个下次再学习。文章来源地址https://www.toymoban.com/news/detail-736453.html
到了这里,关于Flask_Login使用与源码解读的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!