生活随笔
收集整理的這篇文章主要介紹了
DRF 权限 频率
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DRF的權限
權限是什么
大家之前都應該聽過權限,那么我們權限到底是做什么用的呢~~
大家都有博客,或者去一些論壇,一定知道管理員這個角色~
比如我們申請博客的時候,一定要向管理員申請,也就是說管理員會有一些特殊的權利,是我們沒有的~~
這些對某件事情決策的范圍和程度,我們叫做權限,權限是我們在項目開發中非常常用到的~~
那我們看DRF框架給我們提供的權限組件都有哪些方法~~
權限組件源碼
我們之前說過了DRF的版本和認證,也知道了權限和頻率跟版本認證都是在initial方法里初始化的~~
其實我們版本,認證,權限,頻率控制走的源碼流程大致相同,大家也可以在源碼里看到~~
我們的權限類一定要有has_permission方法,否則就會拋出異常,這也是框架給我提供的鉤子~~
我們先看到在rest_framework.permissions這個文件中,存放了框架給我們提供的所有權限的方法~~
我這里就不帶著大家詳細去看每一個了,大家可以去瀏覽一下每個權限類,看看每個都是干嘛的~~
這里主要說下BasePermission 這個是我們寫權限類繼承的一個基礎權限類
權限的詳細用法
在這里我們一定要清楚一點,我們的Python代碼是一行一行執行的,那么執行initial方法初始化這些組件的時候~~
也是有順序的,我們的版本在前面,然后是認證,然后是權限,最后是頻率,所以大家要清楚~~
我們的權限執行的時候,我們的認證已經執行結束了~~
前提在model中的UserInfo表中加了一個字段,用戶類型的字段,做好數據遷移~~
第一步 寫權限類
class MyPermission(BasePermission
):message
= "VIP用戶才能訪問"def has_permission(self
, request
, view
):"""自定義權限只有vip用戶能訪問,注意我們初始化時候的順序是認證在權限前面的,所以只要認證通過~我們這里就可以通過request.user,拿到我們用戶信息request.auth就能拿到用戶對象"""if request
.user
and request
.auth
.type == 2:return Trueelse:return False
局部視圖注冊
class TestAuthView(APIView
):authentication_classes
= [MyAuth
, ]permission_classes
= [MyPermission
, ]def get(self
, request
, *args
, **kwargs
):print(request
.user
)print(request
.auth
)username
= request
.user
return Response
(username
)
全局注冊 settings.py
REST_FRAMEWORK
= {'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning','ALLOWED_VERSIONS': ['v1', 'v2'],'VERSION_PARAM': 'version','DEFAULT_VERSION': 'v1',"DEFAULT_PERMISSION_CLASSES": ["BROP.utils.MyPermission"]
}
DRF的頻率
頻率限制是做什么的
開放平臺的API接口調用需要限制其頻率,以節約服務器資源和避免惡意的頻繁調用。
我們的DRF提供了一些頻率限制的方法,我們看一下。
頻率組件源碼
版本,認證,權限,頻率這幾個組件的源碼是一個流程,這里就不再帶大家走源碼了~
相信大家可以自己看懂了,下面我們談談頻率組件實現的原理~~
頻率組件原理
DRF中的頻率控制基本原理是基于訪問次數和時間的,當然我們可以通過自己定義的方法來實現。
當我們請求進來,走到我們頻率組件的時候,DRF內部會有一個字典來記錄訪問者的IP,
以這個訪問者的IP為key,value為一個列表,存放訪問者每次訪問的時間,
{ IP1: [第三次訪問時間,第二次訪問時間,第一次訪問時間],}
把每次訪問最新時間放入列表的最前面,記錄這樣一個數據結構后,通過什么方式限流呢~~
如果我們設置的是10秒內只能訪問5次,
– 1,判斷訪問者的IP是否在這個請求IP的字典里
– 2,保證這個列表里都是最近10秒內的訪問的時間
判斷當前請求時間和列表里最早的(也就是最后的)請求時間的查
如果差大于10秒,說明請求以及不是最近10秒內的,刪除掉,
繼續判斷倒數第二個,直到差值小于10秒
– 3,判斷列表的長度(即訪問次數),是否大于我們設置的5次,
如果大于就限流,否則放行,并把時間放入列表的最前面
頻率組件的詳細用法
頻率組件的配置方式其實跟上面的組件都一樣,我們看下頻率組件的使用。
自定義的頻率限制類
from rest_framework
.throttling
import BaseThrottle
import timeVISIT_RECORD
= {}class MyThrottle(BaseThrottle
):def __init__(self
):self
.history
= Nonedef allow_request(self
, request
, view
):ip
= request
.META
.get
("REMOTE_ADDR")now
= time
.time
()if ip
not in VISIT_RECORD
:VISIT_RECORD
[ip
] = [now
,]return Truehistory
= VISIT_RECORD
[ip
]history
.insert
(0, now
)while history
and history
[0] - history
[-1] > 60:history
.pop
()self
.history
= history
if len(history
) > 3:return Falseelse:return Truedef wait(self
):time
= 60 - (self
.history
[0] - self
.history
[-1])return time
頻率限制的配置
REST_FRAMEWORK
= {"DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyThrottle"],}
}
使用自帶的頻率限制類
from rest_framework
.throttling
import SimpleRateThrottle
class MyVisitThrottle(SimpleRateThrottle
):scope
= "WD"def get_cache_key(self
, request
, view
):return self
.get_ident
(request
)
配置頻率限制
REST_FRAMEWORK
= {"DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyThrottle"],"DEFAULT_THROTTLE_RATES":{'WD':'5/m', }
}
我們可以在postman,或者DRF自帶的頁面進行測試都可以~~
總結
以上是生活随笔為你收集整理的DRF 权限 频率的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。