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