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个成员):
该些回调函数成员并不是直接被调用,而是通过
  1. reload_user,
  2. _load_from_cookie,
  3. _load_from_request,
  4. _load_from_headers)
4个函数完成调用。



一、LoginManager的加载用户相关回调函数成员变量介绍
 

1、token_callback 
是一个回调函数成员,负责从token中来加载用户,类似于函数指针的概念,从cookie携带的参数中获取,具体行为由自己定义的回调函数决定
该成员的设置由LoginManager.token_loader装饰器来完成,代码如下
  1. @LoginManager.token_loader
  2. def token_loader(cookie):
  3. ... # do something to get user  
  4. return user


该装饰器函数定义:


2、user_callback
是一个负责利用user_id来完成用户加载的回调函数。
该成员由LoginManager.user_loader装饰器完成,代码如下:
  1. @LoginManager.user_loader
  2. def user_loader(user_id):
  3. ...
  4. ... # do something to get user
  5. return user

装饰器函数如下,callback的函数参数为user_id(这个是因为user_callback在框架中调用的时候传入的是user_id,后续会补充)
 

3、request_callback
负责从请求体中获取用户的回调函数(类似于函数指针的概念,从请求体中携带的参数中获取,具体行为由自己定义的回调函数决定)。一般由LoginManager.request_loader装饰器完成设置,代码如下
  1. @LoginManager.request_loader
  2. def request_loader(request):
  3. ...
  4. ... # do something to get user
  5. return user
具体装饰器代码和前面介绍的两种成员类似,可以去看源码,不再赘述。

4、header_callback
负责从header中加载获取用户(在header中设置一个请求头,从该头中获取参数,具体行为自己定义),一般由LoginManager.header_loader装饰器完成设置,代码如下
  1. @LoginManager.user_loader
  2. def header_loader(header):
  3. ...
  4. ... # do something to get user
  5. 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来加载用户。这也是为什么一般例程中都需要实现如下代码的原因,因为这是默认加载方法。
  1. @login_manager.user_loader
  2. def user_loader(user_id):
  3. ...#do something to get user
  4. return user

总结:需要使用flask-login模块,必须先利用LoginManager对象的装饰器初始化其对应的加载用户的回调函数(一共为四个,对应四种加载方法),至少初始化一个。
对于回调函数的参数的细节,可以查看LoginManager的_load_user的实现来判断,具体的请参照step 2的说明。

在网上搜索无果,自己看源码总结的,有点乱,第一次学python,然后还有没有明白的是:_load_user是如何调用的?没有发现,不正指出还望指出