rest_framework之訪問頻率控制
阿新 • • 發佈:2018-12-14
一 自定義頻率控制類
class MyThrottle(): visitor_dic = {} def __init__(self): self.history = None def allow_request(self, request, view): ''' {'ip1':[時間1 ,時間2], 'ip2':[時間1, ], } #(1)取出訪問者ip # (2)判斷當前ip不在訪問字典裡,新增進去,並且直接返回True,表示第一次訪問,在字典裡,繼續往下走 # (3)迴圈判斷當前ip的列表,有值,並且當前時間減去列表的最後一個時間大於60s,把這種資料pop掉,這樣列表中只有60s以內的訪問時間, # (4)判斷,當列表小於3,說明一分鐘以內訪問不足三次,把當前時間插入到列表第一個位置,返回True,順利通過 # (5)當大於等於3,說明一分鐘內訪問超過三次,返回False驗證失敗''' # Meta:請求所有的東西的字典 # 拿出ip地址 ip = request.META.get('REMOTE_ADDR') # 不在字典中,說明是第一次訪問 ctime = time.time() if ip not in self.visitor_dic: self.visitor_dic[ip] = [ctime, ] return True # 根據當前訪問者ip,取出訪問的時間列表 history = self.visitor_dic[ip] self.history= history while history and ctime - history[-1] > 60: history.pop() if len(history) < 3: # 把當前時間放到第0個位置上 history.insert(0, ctime) return True return False def wait(self): # 剩餘時間 ctime = time.time()return 60 - (ctime - self.history[-1])
二 內建頻率控制
在app中新建一個檔案,來放相關元件:
from rest_framework.throttling import SimpleRateThrottle class VisitThrottle(SimpleRateThrottle): scope = 'hhh' def get_cache_key(self, request, view): return self.get_ident(request)
在settings中配置訪問:
REST_FRAMEWORK = { 'DEFAULT_THROTTLE_RATES':{ 'hhh':'3/m' } }
在檢視函式中:(區域性配置)
throttle_classes = [MyThrottles,]
錯誤資訊提示轉換為中文:
class Course(APIView): authentication_classes = [TokenAuth, ] permission_classes = [UserPermission, ] throttle_classes = [MyThrottles,] def get(self, request): return HttpResponse('get') def post(self, request): return HttpResponse('post') def throttled(self, request, wait): from rest_framework.exceptions import Throttled class MyThrottled(Throttled): default_detail = '傻逼啊' extra_detail_singular = '還有 {wait} second.' extra_detail_plural = '出了 {wait} seconds.' raise MyThrottled(wait)
其他
內建頻率限制類:
BaseThrottle是所有類的基類:方法:def get_ident(self, request)獲取標識,其實就是獲取ip,自定義的需要繼承它
AnonRateThrottle:未登入使用者ip限制,需要配合auth模組用
SimpleRateThrottle:重寫此方法,可以實現頻率現在,不需要咱們手寫上面自定義的邏輯
UserRateThrottle:登入使用者頻率限制,這個得配合auth模組來用
ScopedRateThrottle:應用在區域性檢視上的(忽略)
內建頻率全域性配置:
REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES':['app01.utils.VisitThrottle',], 'DEFAULT_THROTTLE_RATES':{ 'hhh':'3/m' } }