您好,登錄后才能下訂單哦!
前言
開發平臺的API接口調用需要限制其頻率,以節約服務器資源和避免惡意的頻繁調用.
DRF就為我們提供了一些頻率限制的方法.
DRF中的版本、認證、權限、頻率組件的源碼是一個流程,且頻率組件在最后執行.
DRF頻率組件原理
DRF中的頻率控制基本原理是基于訪問次數和時間的,當然我們也可以通過自己定義的方法來實現.
當請求進來,走到我們的頻率組件時,DRF內部會有一個字典來記錄訪問者的IP.
以這個字典的IP為key,value為一個列表,存放訪問者每次訪問的時間:{PI1: [第三次訪問時間, 第二次訪問時間, 第一次訪問時間, ]}
把每次訪問的最新時間放入列表的最前面,記錄這樣一個數據結構后,通過如下方式限制:
如果我們設置的是10秒內只能訪問5次:
1.判斷訪問者的IP是否在這個請求IP的字典里.
2.保證這個列表里都是都是最近10秒內訪問的時間.
判斷當前請求時間和列表里最早的(也就是最后一個)請求時間差
如果差大于10秒,說明請求不是最近10秒內的,刪除掉最后一個
繼續判斷倒數第二個、第三個,直到差小于10秒為止
3.判斷列表的長度(即訪問次數)是否大于我們設置的5次.
如果大于,則限制其訪問
如果小于,則放行,并把時間記錄到列表的最前面
使用自帶的頻率限制類
首先 配置頻率限制類
from rest_framework.throttling import SimpleRateThrottle # 導入內置的頻率限制類 class DRFThrottle(SimpleRateThrottle): """注意:這里都是必備的屬性、方法和返回值""" scope = 'WD' def get_cache_key(self, request, view): # 拿IP地址 return self.get_ident(request)
然后 配置文件
REST_FRAMEWORK = { # 指定頻率限制的類 "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.DRFThrottle'], # WD是scope定義的值,3/m表示每分鐘不能超過3次訪問 "DEFAULT_THROTTLE_RATES": {"WD": "3/m"}, } """ 如果只是想給單個視圖做頻率限制: 則刪除這里的"DEFAULT_THROTTLE_CLASSES"配置項 并在要做頻率限制的視圖中指定頻率限制類即可 指定語法:throttle_classes = ["頻率限制類", ] """
開始測試
訪問測試頁面,連續刷新3次后,可看到:
使用自定義的頻率限制類
首先 自定義頻率限制類
import time VISIT_RECORD = {} # 限制訪問次數的字典 class MyThrottle(): """ 自定義頻率限制類,一分鐘允許訪問5次 注意:自定義頻率限制類中必須要有allow_request和wait方法 前者用于頻率限制的邏輯,后者用于返回限制時間還剩多少秒 """ def __init__(self): self.history = [] def allow_request(self, request, view): """用于限制訪問的邏輯""" # 獲取用戶的IP地址 ip = request.META.get('REMOTE_ADDR') if ip not in VISIT_RECORD: VISIT_RECORD[ip] = [time.time(), ] else: history = VISIT_RECORD[ip] self.history = history history.insert(0, time.time()) # 確保訪問時間在允許范圍之內 while self.history[0] - self.history[-1] > 60: self.history.pop() # 確定訪問次數在允許的范圍內 if len(self.history) >= 5: return False return True def wait(self): """用于返回限制時間還剩多少秒""" return 60 - (self.history[0] - self.history[-1])
然后 配置文件
REST_FRAMEWORK = { # 指定自定義的頻率限制類 "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.MyThrottle'], } > """ 如果只是想給單個視圖做頻率限制: 則刪除這里的"DEFAULT_THROTTLE_CLASSES"配置項 并在要做頻率限制的視圖中指定頻率限制類即可 指定語法:throttle_classes = ["頻率限制類", ] """
好了,就到這里吧.
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。