drf十大組件
認(rèn)證? ?權(quán)限(授權(quán))? ? 用戶訪問次數(shù)/頻率限制? ? 版本? ?解析器(parser)??
序列化? ? 分頁? ?路由系統(tǒng)? ? 視圖? ? 渲染器
drf認(rèn)證流程:
1.首先執(zhí)行dispatch方法
2.重新封裝Request
3.initial(request)方法里面有各種封裝函數(shù), 其中perform_authentication(request)是認(rèn)證的函數(shù), 返回一個request.user
4.def _authenticate():循環(huán)所有的authentication對象,執(zhí)行authenticate方法
5.Authtication 自定義認(rèn)證類
6.def authenticate():
自定義認(rèn)證
-報錯
-返回元組(request.user, request.auth)
drf權(quán)限流程:
1.首先執(zhí)行dispatch方法
2.重新封裝Request
3.initial(request)方法里面有各種封裝函數(shù), 其中check_permissions(request)是權(quán)限的函數(shù)
4. check_permissions中的has_permission()(要復(fù)寫)就是權(quán)限函數(shù)(get_permissions循環(huán)所有權(quán)限類)
5. Permisson自定義權(quán)限類
has_permission自定義權(quán)限
True, 有權(quán)限
False, 無權(quán)限
其中message屬性為沒有權(quán)限返回的字符串
drf限流(頻率)流程:
頻率組件原理
DRF中的頻率控制基本原理是基于訪問次數(shù)和時間的理肺,當(dāng)然我們可以通過自己定義的方法來實現(xiàn)摄闸。
當(dāng)我們請求進(jìn)來,走到我們頻率組件的時候妹萨,DRF內(nèi)部會有一個字典來記錄訪問者的IP年枕,
以這個訪問者的IP為key,value為一個列表乎完,存放訪問者每次訪問的時間熏兄,
{? IP1: [第三次訪問時間,第二次訪問時間树姨,第一次訪問時間]摩桶,}
把每次訪問最新時間放入列表的最前面,記錄這樣一個數(shù)據(jù)結(jié)構(gòu)后娃弓,通過什么方式限流呢~~
如果我們設(shè)置的是10秒內(nèi)只能訪問5次典格,
-- 1,判斷訪問者的IP是否在這個請求IP的字典里
-- 2台丛,保證這個列表里都是最近10秒內(nèi)的訪問的時間
判斷當(dāng)前請求時間和列表里最早的(也就是最后的一個的)請求時間的差
如果差大于10秒耍缴,說明請求已經(jīng)不是最近10秒內(nèi)的砾肺,刪除掉,
繼續(xù)判斷倒數(shù)第二個防嗡,直到差值小于10秒
-- 3变汪,判斷列表的長度(即訪問次數(shù)),是否大于我們設(shè)置的5次蚁趁,
如果大于就限流裙盾,否則放行,并把時間放入列表的最前面他嫡。
限流(頻率)流程:
1.首先執(zhí)行dispatch方法
2.重新封裝Request
3.initial(request)方法里面有各種封裝函數(shù), 其中check_throttles是關(guān)于限流的
版本:
1.和認(rèn)證的流程一樣番官,進(jìn)入initial(request)
2.在認(rèn)證,權(quán)限钢属,節(jié)流前先執(zhí)行了這兩句函數(shù),獲取到version,scheme徘熔,并分別賦值給request對象的version, versioning_scheme屬性
3.進(jìn)入determine_version()函數(shù)
4.在這里獲取到scheme就是api_settings.DEFAULT_VERSIONING_CLASS,系統(tǒng)默認(rèn)版本控制類,那scheme.determine_version(request, *args,kwargs) 就是該類下的一個方法
5.查看rest_framework庫的一個自帶類中的determine_version方法淆党,?返回的是版本號酷师。于是version, scheme分別是版本號和一個版本控制類,并分別賦值給request對象的version, versioning_scheme屬性染乌。
DRF內(nèi)置的解析器FormParser,JSONParser