權限是什麼
權限究竟是是幹什麼用的
好比,咱們申請博客的時候,必定要向管理員申請,也就是說管理員會有一些特殊的權利,咱們做爲用戶是沒有的
這些對某些事情決策的範圍和程度,咱們叫作權限,權限是咱們在項目開發中很是經常使用的
那麼看DRF框架給咱們提供的權限組件有哪些方法
權限組件源碼
咱們以前有DRF的版本和認證,也就知道了權限和頻率跟版本認證都是在initial方法裏初始化的數據庫
其實咱們版本,認證,權限,頻率控制走的源碼流程大體相同
咱們的權限類必定要有has_permission方法,不然會拋出異常,這就是框架爲咱們提供的鉤子
咱們先看到在rest_framework.permissions這個文件紅中,存放了框架爲咱們提供的全部權限的方法
這裏主要說一下BasePermission這個咱們寫權限繼承的一個基礎權限類服務器
權限的詳細用法
在這裏咱們必定要清楚一點,咱們的python代碼是一行一行執行的,那麼執行intial方法初始化這些組件的時候
也就是順序的,咱們的版本在前面,而後是認證,而後是權限,最後是頻率
咱們的權限執行的時候,咱們的認證已經執行結束了
前提是在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 True else: 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
DEF的頻率
頻率限制是作什麼的
開放平臺的API接口調用須要限制其頻率,以節約服務器資源和避免惡意的頻繁調用
那咱們的DRF提供了一些什麼樣的頻率限制的方法
頻率組件源碼
版本,認證,權限,頻率這幾個組件的源碼是一個流程
能夠突破一下本身,這個本身看
頻率組件原理
DRF中的頻率控制基本原理是基於訪問次數和時間的,固然咱們能夠經過本身定義的方法來實現。restful
當咱們請求進來時,走到咱們的頻率組件的時候,DRF內部會有一個字典來記錄訪問者的IP
以這個訪問者的IP爲key,value爲一個列表,存放訪問者每次訪問的時間
{IP1: [第三次訪問的時間, 第二次訪問的時間, 第一次訪問的時間]}
把每次訪問最新時間放入到列表的最前面,記錄這樣一個數據結構,經過什麼方式限流呢:
若是咱們設置的時間是10秒內只能訪問5次數據結構
1,判斷訪問者的IP是否在這個請求IP的字典裏
2,保證這個列表裏都是最近10秒內的訪問的時間
判斷當前請求時間和列表裏最先的(也就是最後的)請求時間的查
若是差大於10秒,說明請求以及不是最近10秒內的,刪除掉
繼續判斷倒數第二個值,知道差值小於10秒
3,判斷列表的長度(即訪問次數),是否大於咱們設置的5次
若是大於就限流,不然放行,並把時間放入了列表的最前面
頻率組件的詳細用法
頻率組件的配置方式其實就是跟上面的組件都同樣框架
第一步
|
VISIT_RECORD = {} class MyThrottle(object):
def __init__(self): self.history = None
def allow_request(self, request, view): """ 自定義頻率限制60秒內只能訪問三次 """ |
第二步
第三步
|
from rest_framework.throttling import SimpleRateThrottle
class MyVisitThrottle(SimpleRateThrottle): scope = "WD"
def get_cache_key(self, request, view): return self.get_ident(request)
|
第四步
能夠在postman或者DRF自帶的頁面進行測試ide