頻率元件 LL

朱饱饱發表於2024-03-13


1、throttle

"""
系統:
1)AnonRateThrottle:對同一IP遊客的限制
2)UserRateThrottle:對同一IP登入使用者的限制
必須在settings.py中
'DEFAULT_THROTTLE_RATES': {
    'user': '10/min',  # 登入的使用者一分鐘可以訪問10次
    'anon': '3/min',  # 遊客一分鐘可以訪問3次
}
在檢視類中:
class TempAPIView(APIView):
    ...
    throttle_classes = [AnonRateThrottle, UserRateThrottle]
    
    

自定義:基於auth的Group與Permission表
1)自定義頻率類,繼承SimpleRateThrottle,重寫get_cache_key,明確scope
    SimpleRateThrottle已經幫我們實現了 allow_request、wait
2)scope與settings.py的DEFAULT_THROTTLE_RATES配合使用
3)get_cache_key中完成
    拿到限制資訊 ident <= request中獲取
    沒有限制資訊 返回None => 不限制
    有限制資訊 返回限制資訊字串 => 有限制
"""

2、自定義頻率類:一分鐘一個手機號只允許訪問一次介面

程式碼:

from rest_framework.throttling import SimpleRateThrottle

class ThreeMinRateThrottle(SimpleRateThrottle):
    scope = 'sms'
    def get_cache_key(self, request, view):
        # 對手機號頻率限制
        ident = request.data.get('mobile')
        if not ident:  # 為發現限制條件,返回None代表不進行頻率限制
            return None
        return self.cache_format % {
            'scope': self.scope,
            'ident': ident
        }
# settings.py
'DEFAULT_THROTTLE_RATES': {
    'user': '10/min',  # 登入的使用者一分鐘可以訪問10次
    'anon': '3/min',  # 遊客一分鐘可以訪問3次
    'sms': '1/min',
}



程式碼解讀:

ThreeMinRateThrottle 是一個自定義的速率限制類,它繼承自 Django REST framework 中的 SimpleRateThrottle 類。這個類主要用於實現針對手機號傳送簡訊介面的頻率限制策略。

在 get_cache_key 方法中:

首先嚐試從請求的資料(request.data)中獲取手機號碼(mobile)作為客戶端唯一識別符號(ident)。
如果沒有找到手機號碼,則返回 None,這意味著不對此請求應用任何速率限制。
如果找到了手機號碼,則根據指定的範圍(scope,在這裡為 'sms')和手機號碼生成快取鍵。這個快取鍵將用於儲存該特定手機在過去一段時間內的請求次數。
透過設定 THROTTLE_RATES 字典中的 'sms' 項,可以指定每三分鐘內允許該手機號傳送簡訊的最大請求次數。例如,在設定檔案中新增以下內容:

REST_FRAMEWORK = { ... 
  'THROTTLE_RATES': { 'sms': '3/min', # 表示每三分鐘允許傳送一次簡訊 },
  ... } 然後在需要進行簡訊傳送速率限制的檢視中引用此限流器:
from rest_framework.views import APIView
from .throttles import ThreeMinRateThrottle
class SmsSendView(APIView):
  throttle_classes = [ThreeMinRateThrottle]
  def post(self, request):
  # 簡訊傳送邏輯...
  pass

 

相關文章