欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Django-restframework 之頻率源碼分析

 更新時間:2019年02月27日 08:30:55   作者:Eurekaa  
這篇文章主要介紹了Django-restframework 之頻率源碼分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一 前言

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

二 頻率組件執(zhí)行流程

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

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

1. init方法

2. get_rate

3. 執(zhí)行 allow_request方法

4. get_cache_key

5. 時間差判斷

6. throttle_success

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

7. wait

三 自定義頻率組件

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,表示第一次訪問,在字典里,繼續(xù)往下走
#     # (3)循環(huán)判斷當前ip的列表,有值,并且當前時間減去列表的最后一個時間大于60s,把這種數(shù)據(jù)pop掉,這樣列表中只有60s以內(nèi)的訪問時間,
#     # (4)判斷,當列表小于3,說明一分鐘以內(nèi)訪問不足三次,把當前時間插入到列表第一個位置,返回True,順利通過
#     # (5)當大于等于3,說明一分鐘內(nèi)訪問超過三次,返回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)循環(huán)判斷當前ip的列表,有值,并且當前時間減去列表的最后一個時間大于60s,把這種數(shù)據(jù)pop掉,這樣列表中只有60s以內(nèi)的訪問時間,
#     while self.history and ctime-self.history[-1]>60:
#       self.history.pop()
#     # (4)判斷,當列表小于3,說明一分鐘以內(nèi)訪問不足三次,把當前時間插入到列表第一個位置,返回True,順利通過
#     # (5)當大于等于3,說明一分鐘內(nèi)訪問超過三次,返回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 = []

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python連接MySQL數(shù)據(jù)庫的四種方法

    Python連接MySQL數(shù)據(jù)庫的四種方法

    用?Python?連接到?MySQL?數(shù)據(jù)庫的方法不是很系統(tǒng),實際中有幾種不同的連接方法,而且不是所有的方法都能與不同的操作系統(tǒng)很好地配合,本文涵蓋了四種方法,你可以用它們來連接你的Python應用程序和MySQL,需要的朋友可以參考下
    2024-08-08
  • Python讀寫文件基礎知識點

    Python讀寫文件基礎知識點

    在本篇文章中小編給大家整理了關于Python讀寫文件的基礎知識內(nèi)容,有興趣的朋友們跟著學習下。
    2019-06-06
  • 利用python操作SQLite數(shù)據(jù)庫及文件操作詳解

    利用python操作SQLite數(shù)據(jù)庫及文件操作詳解

    這篇文章主要給大家介紹了關于利用python操作SQLite數(shù)據(jù)庫及文件操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • python讀取目錄下最新的文件夾方法

    python讀取目錄下最新的文件夾方法

    今天小編就為大家分享一篇python讀取目錄下最新的文件夾方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • TensorFlow進階學習定制模型和訓練算法

    TensorFlow進階學習定制模型和訓練算法

    本文將為你提供關于 TensorFlow 的中級知識,你將學習如何通過子類化構建自定義的神經(jīng)網(wǎng)絡層,以及如何自定義訓練算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • python是否適合網(wǎng)頁編程詳解

    python是否適合網(wǎng)頁編程詳解

    在本篇文章里我們給各位整理了一篇關于python是否適合網(wǎng)頁編程詳解內(nèi)容,有需要的朋友們可以學習下。
    2019-10-10
  • Python爬蟲之Selenium實現(xiàn)窗口截圖

    Python爬蟲之Selenium實現(xiàn)窗口截圖

    這篇文章主要介紹了Python爬蟲之Selenium實現(xiàn)窗口截圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 如何通過Python的pyttsx3庫將文字轉(zhuǎn)為音頻

    如何通過Python的pyttsx3庫將文字轉(zhuǎn)為音頻

    pyttsx3是一個開源的Python文本轉(zhuǎn)語音庫,可以將文本轉(zhuǎn)換為自然的人類語音,這篇文章主要介紹了如何通過Python的pyttsx3庫將文字轉(zhuǎn)為音頻,需要的朋友可以參考下
    2023-04-04
  • Python裝飾器知識點補充

    Python裝飾器知識點補充

    本篇文章給大家補充了關于Python裝飾器的相關知識點內(nèi)容,大家可以跟著學習參考下。
    2018-05-05
  • Python3列表List入門知識附實例

    Python3列表List入門知識附實例

    序列是Python中最基本的數(shù)據(jù)結構。序列中的每個元素都分配一個數(shù)字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推
    2020-02-02

最新評論