亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django-restframework之頻率的示例分析

發布時間:2021-08-30 13:53:52 來源:億速云 閱讀:166 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Django-restframework之頻率的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一 前言

經過權限判斷之后就是進行頻率的判斷了,而頻率的判斷和權限又不一樣,認證、權限和頻率的執行流程都差不多,使用配置里面的相關類來進行判斷。而不和認證和權限一樣,頻率的配置沒有,查看 APIView 的類屬性如下:

Django-restframework之頻率的示例分析

Django-restframework之頻率的示例分析

二 頻率組件執行流程

雖然 restframework 原生滅有配置頻率,但是提供了幾個進行頻率判斷的類,如下:

Django-restframework之頻率的示例分析

其中 SimpleRateThrottle 類是根據訪問者 ip 來進行頻率限制的一個類,來看看這個類的執行流程。

1. init方法

Django-restframework之頻率的示例分析

2. get_rate

Django-restframework之頻率的示例分析

3. 執行 allow_request方法

Django-restframework之頻率的示例分析

4. get_cache_key

Django-restframework之頻率的示例分析

5. 時間差判斷

Django-restframework之頻率的示例分析

6. throttle_success

Django-restframework之頻率的示例分析

認證失敗的話執行 throttle_failure ,其實就是返回 False

7. wait

Django-restframework之頻率的示例分析

三 自定義頻率組件

1. 自定義頻率類

頻率類需要繼承自帶的頻率類

# from rest_framework.throttling import BaseThrottle

class BookThrottle(BaseThrottle):

  VISIT_RECORD = {}

  def __init__(self):
    self.history = None

  def allow_request(self, request, view):
    print(request.META)
    REMOTE_ADDR = request.META.get('REMOTE_ADDR')

    import time
    ctime = time.time()
    if REMOTE_ADDR not in self.VISIT_RECORD:
      self.VISIT_RECORD[REMOTE_ADDR] = [ctime,]
      return True
    self.history = self.VISIT_RECORD.get(REMOTE_ADDR)

    while self.history and ctime - self.history[-1] > 60:
      self.history.pop()

    if len(self.history) < 3:
      self.history.insert(0, ctime)
      return True
    else:
      return False

  def wait(self):
    import time
    ctime = time.time()

    return 60 - (ctime - self.history[-1])
# 頻率類代碼注釋
     # 訪問頻率的邏輯
#     #   {'ip地址':[16:13:39,16:13:19,],'ip地址2':[時間1,時間2],}
#     # (1)取出訪問者ip
#     # (2)判斷當前ip不在訪問字典里,添加進去,并且直接返回True,表示第一次訪問,在字典里,繼續往下走
#     # (3)循環判斷當前ip的列表,有值,并且當前時間減去列表的最后一個時間大于60s,把這種數據pop掉,這樣列表中只有60s以內的訪問時間,
#     # (4)判斷,當列表小于3,說明一分鐘以內訪問不足三次,把當前時間插入到列表第一個位置,返回True,順利通過
#     # (5)當大于等于3,說明一分鐘內訪問超過三次,返回False驗證失敗
#     #(1)取出訪問者ip
#     # print(request.META)
#     # REMOTE_ADDR 就是訪問者的ip:127.0.0.1
#     ip=request.META.get('REMOTE_ADDR')
#     import time
#     # 獲取當前時間
#     ctime=time.time()
#     # (2)判斷當前ip不在訪問字典里,添加進去,并且直接返回True,表示第一次訪問
#     if ip not in self.VISIT_RECORD:
#       self.VISIT_RECORD[ip]=[ctime,]
#       # {'127.0.0.1':[時間1,時間1,]}
#       return True
#     # self.history=[時間1,時間1,]
#     self.history=self.VISIT_RECORD.get(ip)
#     # (3)循環判斷當前ip的列表,有值,并且當前時間減去列表的最后一個時間大于60s,把這種數據pop掉,這樣列表中只有60s以內的訪問時間,
#     while self.history and ctime-self.history[-1]>60:
#       self.history.pop()
#     # (4)判斷,當列表小于3,說明一分鐘以內訪問不足三次,把當前時間插入到列表第一個位置,返回True,順利通過
#     # (5)當大于等于3,說明一分鐘內訪問超過三次,返回False驗證失敗
#     if len(self.history)<3:
#       self.history.insert(0,ctime)
#       return True
#     else:
#       return False

2. 使用

使用很簡單,在需要進行頻率控制的視圖類中定義一個屬性 throttle_classes ,如下:

class Book(APIView):
  authentication_classes = [authticate_classes.BookAuth]
  permission_classes = [permiss_classes.LoginPermission]
  throttle_classes = [thrott_classes.BookThrottle]
  # authentication_classes = []

  def dispatch(self, request, *args, **kwargs):
    return super().dispatch(request, *args, **kwargs)

  def get(self, request, id):
    print(request.user, '444')
    response = {'status': 100, 'msg': None}
    book_obj = models.Book.objects.filter(pk=id).first()
    if book_obj:
      book_ser = myser.BookSer(book_obj, many=False)
      response['book'] = book_ser.data
    else:
      response['msg'] = '圖書沒有對象'
      response['status'] = 101
    return Response(response)

四 配置自定義頻率類

 1. 局部配置

其實上面的就是局部配置,

class Book(APIView):
  authentication_classes = [authticate_classes.BookAuth]
  permission_classes = [permiss_classes.LoginPermission]
  throttle_classes = [thrott_classes.BookThrottle]

2. 全局使用

全局配置如下:

REST_FRAMEWORK={
  'DEFAULT_THROTTLE_CLASSES': ['app01.thrott_classes.BookThrottle']
}

3. 局部禁用

局部禁用需要在視圖類中定義一個空的 throttle_classes 屬性

throttle_classes = []

感謝各位的閱讀!關于“Django-restframework之頻率的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

延长县| 拜泉县| 梨树县| 民县| 高阳县| 黄大仙区| 兴业县| 如皋市| 镇宁| 辉县市| 北海市| 南投市| 丽江市| 蒙城县| 荆州市| 融水| 永济市| 东山县| 章丘市| 南阳市| 巴楚县| 梁平县| 柳州市| 德兴市| 济阳县| 阿拉善盟| 唐山市| 刚察县| 康乐县| 平远县| 乌兰察布市| 陇西县| 青阳县| 昂仁县| 缙云县| 宜良县| 金湖县| 金堂县| 定西市| 哈密市| 孟州市|