1. 程式人生 > >rest_framework之訪問頻率控制

rest_framework之訪問頻率控制

一  自定義頻率控制類

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'
    }
}