flask-login用户加载流程,user_callback,token_callback,request_callback,header_call_back相关问题
来源:互联网 发布:美工基础知识 编辑:程序博客网 时间:2024/05/17 22:44
概述:
flask-login主要由LoginManager来负责用户加载,LoginManager把用户加载的逻辑交给用户来实现。
step 1)
用户通过实现特定回调函数,并用该些回调函数初始化LoginManager中对应回调函数成员(user_loader,token_lodader,request_loader,header_loader类似于函数指针,每一个代表的是一种用户加载方法),初始化利用装饰器完成
step 2)
LoginManager会调用_load_user函数,在该函数中判断使用哪一种方法加载用户(step 1中提到的4个成员):
该些回调函数成员并不是直接被调用,而是通过
reload_user,
_load_from_cookie,
_load_from_request,
_load_from_headers)
4个函数完成调用。
1、token_callback
是一个回调函数成员,负责从token中来加载用户,类似于函数指针的概念,从cookie携带的参数中获取,具体行为由自己定义的回调函数决定。
该成员的设置由LoginManager.token_loader装饰器来完成,代码如下
@LoginManager.token_loader
def token_loader(cookie):
...
# do something to get user- return user
该装饰器函数定义:
2、user_callback
是一个负责利用user_id来完成用户加载的回调函数。
该成员由LoginManager.user_loader装饰器完成,代码如下:
@LoginManager.user_loader
def user_loader(user_id):
...
... # do something to get user
return user
装饰器函数如下,callback的函数参数为user_id(这个是因为user_callback在框架中调用的时候传入的是user_id,后续会补充)
3、request_callback
负责从请求体中获取用户的回调函数(类似于函数指针的概念,从请求体中携带的参数中获取,具体行为由自己定义的回调函数决定)。一般由LoginManager.request_loader装饰器完成设置,代码如下
@LoginManager.request_loader
def request_loader(request):
...
... # do something to get user
return user
具体装饰器代码和前面介绍的两种成员类似,可以去看源码,不再赘述。
4、header_callback
负责从header中加载获取用户(在header中设置一个请求头,从该头中获取参数,具体行为自己定义),一般由LoginManager.header_loader装饰器完成设置,代码如下
@LoginManager.user_loader
def header_loader(header):
...
... # do something to get user
return user
二、回调函数成员变量的设置与实际调用
设置
user_callback、token_callback、request_callback、header_callback的设置问题在上面已经介绍。
调用:
分别由reload_user,_load_from_cookie,_load_from_header,_load_from_request完成调用,调用片段代码如下
,具体调用由红框标出。
1)user_callback调用
由该调用也可以得知user_loader装饰器装饰的函数必须是传入user_id参数
2)token_callback调用
3)header_callback调用
4)request_callback调用
从以上4处调用可以知道回调函数应该传入什么参数。
三、用户加载流程(以单次请求为例)
step 1:
请求来到,框架调用LoginManager._load_user()来加载用户,函数定义如下
step 2:
根据单次请求的性质来决定使用哪种方法加载用户,如step 1图中圈出来的红线圈出来的,从其中调用回调函数成员参数值,还可以看出token_callback参数需要的是cookie的值,request_callback参数需要flask请求对象,header_loader参数需要对应hander项的值。
step 3:
如果step 2中没有匹配到对应的加载方法,默认使用reload_user来加载用户。这也是为什么一般例程中都需要实现如下代码的原因,因为这是默认加载方法。
@login_manager.user_loader
def user_loader(user_id):
...#do something to get user
return user
总结:需要使用flask-login模块,必须先利用LoginManager对象的装饰器初始化其对应的加载用户的回调函数(一共为四个,对应四种加载方法),至少初始化一个。
对于回调函数的参数的细节,可以查看LoginManager的_load_user的实现来判断,具体的请参照三中step 2的说明。
在网上搜索无果,自己看源码总结的,有点乱,第一次学python,然后还有没有明白的是:_load_user是如何调用的?没有发现,不正指出还望指出
阅读全文
0 0
- flask-login用户加载流程,user_callback,token_callback,request_callback,header_call_back相关问题
- 用户系统和Flask-Login介绍
- FLask-Login 用户登录简单例子
- Flask-Login
- Flask-login
- Flask-Login
- 用户认证(二)【使用Flask-Login认证用户】
- Flask学习总结笔记(9) -- 利用Flask-Login维护用户登录状态
- Flask-heroku部署相关问题
- flask-login 源码解析
- Flask-Login的使用
- Flask-Login的使用
- python Flask-login
- flask-login API 详解
- Flask学习记录之Flask-Login
- Flask学习记录之Flask-Login
- 用户登录相关问题
- 图片加载相关问题
- C#概念理解-收集
- servlet乱码问题详解
- AC自动机
- JAVAWEB第一天css篇
- 学生信息管理系统7
- flask-login用户加载流程,user_callback,token_callback,request_callback,header_call_back相关问题
- BZOJ1412 [ZJOI2009]狼和羊的故事 最小割
- Python 循环语句和条件语句
- 最常用的15大Eclipse开发快捷键技巧
- 蓝桥杯非VIP题Java全解(不断更新中...)
- PADS 快捷命令(无模指令)
- C 和 C++的比较
- 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- 快速创建一个hibernate,helloworld-demo