DRF 訪問頻率

2022-07-12 06:51:08 字數 1873 閱讀 1684

throttle.py:

from rest_framework.throttling import basethrottle

import time

# 訪問記錄

visit_record = {}

class mythrottle(basethrottle):

"""每 10 秒訪問 3 次

"""def __init__(self):

self.history = none # 用於記錄訪問記錄

def allow_request(self, request, view):

# 獲取使用者的 ip 位址

# 封裝後的 request 中如果有的就不需要到 request._request 中找

remote_addr = request.get_ident(request)

ctime = time.time() # 獲取當前時間

# 如果 ip 還沒記錄,即第一次訪問

if remote_addr not in visit_record:

# 記錄第一次訪問的 ip 位址和訪問時間

visit_record[remote_addr] = [ctime, ]

return true

# 獲取訪問記錄

history = visit_record.get(remote_addr)

self.history = history

# 把當前時間減 10 並和列表中最早的時間進行比較

while history and history[-1] < ctime - 10:

history.pop() # 刪除最早的一條記錄

# 如果還沒有 3 條記錄

if len(history) < 3:

# 將最新的訪問時間插入到列表的第乙個位置

history.insert(0, ctime)

print(history)

return true

return false

# 設定剩餘訪問時間的提示

def wait(self):

ctime = time.time()

return 10 - (ctime - self.history[-1])

history 列表的記錄圖示:

越早的訪問記錄放在列表的越後面的位置,方便操作

settings.py 中可以配置全域性訪問頻率類:

"""檢視訂單

"""# 設定訪問頻率類

throttle_classes = [mythrottle, ]

def get(self, request, *args, **kwargs):

response =

try:

response["data"] = order_dict

except exception as e:

pass

return jsonresponse(response)

10 秒內前 3 次可正常訪問,訪問第 4 次:

drf認證 許可權 頻率 過濾 排序 異常處理

使用方法 1 新建乙個認證類檔案,繼承baseauthentication raise authenticationfailed 驗證失敗 else raise authenticationfailed 請求頭沒有token資訊 2 認證類區域性配置 區域性使用,在列表內發那個值認證類 區域性禁用,...

Redis實現訪問頻率控制

現在系統中由於各種需要,經常遇到一種場景 需要限定每個ip位址每分鐘最大訪問次數類似的需求。下面是使用redis實現范文頻率限制的一種方式。場景 要限制每分鐘每個使用者最多只能訪問100個頁面。思路 1.對每個使用者使用乙個名為 rate.limiting 使用者ip 的字串型別鍵 2.每次使用者訪...

日常 nginx訪問頻率限制

去年的事,隨便記記 2017年3月15日 記錄 nginx限制請求頻率 server外面加上 limit req zone binary remote addr zone one 10m rate 1r s 裡面加上 limit req zone one burst 5 解釋 超過頻率的請求會被放到...