Flask_Login使用与源码解读

一、前言

用户登录后,验证状态需要记录在会话中,这样浏览不同页面时才能记住这个状态,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依次尝试去加载用户。

注:源码中关于回调那块用了Python的Signals机制(信号机制)这个下次再学习。

相关推荐
喵手3 分钟前
Python爬虫零基础入门【第九章:实战项目教学·第17节】内容指纹去重:URL 变体/重复正文的识别!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·内容指纹去重·url变体
喵手26 分钟前
Python爬虫零基础入门【第五章:数据保存与入库·第1节】先学最通用:CSV/JSONL 保存(可复现、可分享)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·数据保存与入库·csv/jsonl
子夜江寒35 分钟前
OpenCV 学习:图像拼接与答题卡识别的实现
python·opencv·学习·计算机视觉
bjxiaxueliang40 分钟前
一文掌握Python Flask:HTTP微服务开发从入门到部署
python·http·flask
SunnyRivers1 小时前
Python 中的 HTTP 客户端:Requests、HTTPX 与 AIOHTTP 对比
python·httpx·requests·aiohttp·区别
JH30731 小时前
SpringBoot自定义启动banner:给项目加个专属“开机画面”
java·spring boot·后端
u0109272712 小时前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
lixin5565562 小时前
基于迁移学习的图像风格增强器
java·人工智能·pytorch·python·深度学习·语言模型
阡陌..2 小时前
浅谈SAR图像处理---形态学滤波
图像处理·人工智能·python
what丶k2 小时前
深度解析Redis LRU与LFU算法:区别、实现与选型
java·redis·后端·缓存