最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一 前言

經(jīng)過權(quán)限判斷之后就是進行頻率的判斷了,而頻率的判斷和權(quán)限又不一樣,認證、權(quán)限和頻率的執(zhí)行流程都差不多,使用配置里面的相關(guān)類來進行判斷。而不和認證和權(quán)限一樣,頻率的配置沒有,查看 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)判斷當(dāng)前ip不在訪問字典里,添加進去,并且直接返回True,表示第一次訪問,在字典里,繼續(xù)往下走
#     # (3)循環(huán)判斷當(dāng)前ip的列表,有值,并且當(dāng)前時間減去列表的最后一個時間大于60s,把這種數(shù)據(jù)pop掉,這樣列表中只有60s以內(nèi)的訪問時間,
#     # (4)判斷,當(dāng)列表小于3,說明一分鐘以內(nèi)訪問不足三次,把當(dāng)前時間插入到列表第一個位置,返回True,順利通過
#     # (5)當(dāng)大于等于3,說明一分鐘內(nèi)訪問超過三次,返回False驗證失敗
#     #(1)取出訪問者ip
#     # print(request.META)
#     # REMOTE_ADDR 就是訪問者的ip:127.0.0.1
#     ip=request.META.get('REMOTE_ADDR')
#     import time
#     # 獲取當(dāng)前時間
#     ctime=time.time()
#     # (2)判斷當(dāng)前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)判斷當(dāng)前ip的列表,有值,并且當(dāng)前時間減去列表的最后一個時間大于60s,把這種數(shù)據(jù)pop掉,這樣列表中只有60s以內(nèi)的訪問時間,
#     while self.history and ctime-self.history[-1]>60:
#       self.history.pop()
#     # (4)判斷,當(dāng)列表小于3,說明一分鐘以內(nèi)訪問不足三次,把當(dāng)前時間插入到列表第一個位置,返回True,順利通過
#     # (5)當(dāng)大于等于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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python在畫圖時使用特殊符號的方法總結(jié)

    Python在畫圖時使用特殊符號的方法總結(jié)

    在制作圖表時,如果遇到需要利用特殊符號進行表示時該怎么辦呢?不用慌,這篇文章為大家總結(jié)了python畫圖中使用各種特殊符號的方式,需要的可以參考一下
    2022-04-04
  • PyQt5實現(xiàn)讓QScrollArea支持鼠標(biāo)拖動的操作方法

    PyQt5實現(xiàn)讓QScrollArea支持鼠標(biāo)拖動的操作方法

    今天小編就為大家分享一篇PyQt5實現(xiàn)讓QScrollArea支持鼠標(biāo)拖動的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 使用TensorFlow直接獲取處理MNIST數(shù)據(jù)方式

    使用TensorFlow直接獲取處理MNIST數(shù)據(jù)方式

    今天小編就為大家分享一篇使用TensorFlow直接獲取處理MNIST數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • PyCharm接入DeepSeek實現(xiàn)AI編程的操作流程

    PyCharm接入DeepSeek實現(xiàn)AI編程的操作流程

    DeepSeek 是一家專注于人工智能技術(shù)研發(fā)的公司,致力于開發(fā)高性能、低成本的 AI 模型,接下來,我們把DeepSeek接入到PyCharm中,并利用其能力輔助我們進行代碼開發(fā),感興趣的小伙伴跟著小編一起來看看吧
    2025-01-01
  • Django配置MySQL數(shù)據(jù)庫的完整步驟

    Django配置MySQL數(shù)據(jù)庫的完整步驟

    這篇文章主要給大家介紹了關(guān)于Django配置MySQL數(shù)據(jù)庫的完整步驟,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Python+OpenCV實現(xiàn)在圖像上繪制矩形

    Python+OpenCV實現(xiàn)在圖像上繪制矩形

    這篇文章主要介紹了如何利用Python和OpenCV實現(xiàn)在圖像上繪制任意大小的矩形,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下
    2022-03-03
  • 如何用Python繪制棒棒糖圖表

    如何用Python繪制棒棒糖圖表

    這篇文章主要介紹了如何用Python繪制棒棒糖圖表,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-05-05
  • 解決Django transaction進行事務(wù)管理踩過的坑

    解決Django transaction進行事務(wù)管理踩過的坑

    這篇文章主要介紹了解決Django transaction進行事務(wù)管理踩過的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python 讀取yaml文件的兩種方法(在unittest中使用)

    python 讀取yaml文件的兩種方法(在unittest中使用)

    這篇文章主要介紹了python 讀取yaml文件的兩種方法(在unittest中使用),幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-12-12
  • 利用Python編寫簡易版德州撲克小游戲

    利用Python編寫簡易版德州撲克小游戲

    德州撲克不知道大家是否玩過,它是起源于美國的得克薩斯州的一種博弈類卡牌游戲,英文名叫做Texas?Hold’em?Poker。本文將用Python實現(xiàn)這一游戲,需要的可以參考一下
    2022-03-03

最新評論

德惠市| 凌云县| 遂昌县| 手游| 文水县| 科技| 宣威市| 建昌县| 平邑县| 浮山县| 青龙| 全南县| 泸水县| 石景山区| 恭城| 水富县| 长沙县| 海安县| 东乌珠穆沁旗| 惠东县| 宣化县| 察隅县| 九龙县| 渭源县| 出国| 兴安盟| 汉源县| 普安县| 寿阳县| 靖州| 利津县| 通海县| 容城县| 大丰市| 冷水江市| 永清县| 尉氏县| 六枝特区| 淄博市| 闽清县| 封丘县|