flask-login用戶加載流程,user_callback,token_callback,request_callback,header_call_back相關問題

概述:
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是如何調用的?沒有發現,不正指出還望指出

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章