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

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

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

一 前言

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

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

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

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

1. init方法

2. get_rate

3. 執(zhí)行 allow_request方法

4. get_cache_key

5. 時(shí)間差判斷

6. throttle_success

認(rèn)證失敗的話執(zhí)行 throttle_failure ,其實(shí)就是返回 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':[時(shí)間1,時(shí)間2],}
#     # (1)取出訪問者ip
#     # (2)判斷當(dāng)前ip不在訪問字典里,添加進(jìn)去,并且直接返回True,表示第一次訪問,在字典里,繼續(xù)往下走
#     # (3)循環(huán)判斷當(dāng)前ip的列表,有值,并且當(dāng)前時(shí)間減去列表的最后一個(gè)時(shí)間大于60s,把這種數(shù)據(jù)pop掉,這樣列表中只有60s以內(nèi)的訪問時(shí)間,
#     # (4)判斷,當(dāng)列表小于3,說明一分鐘以內(nèi)訪問不足三次,把當(dāng)前時(shí)間插入到列表第一個(gè)位置,返回True,順利通過
#     # (5)當(dāng)大于等于3,說明一分鐘內(nèi)訪問超過三次,返回False驗(yàn)證失敗
#     #(1)取出訪問者ip
#     # print(request.META)
#     # REMOTE_ADDR 就是訪問者的ip:127.0.0.1
#     ip=request.META.get('REMOTE_ADDR')
#     import time
#     # 獲取當(dāng)前時(shí)間
#     ctime=time.time()
#     # (2)判斷當(dāng)前ip不在訪問字典里,添加進(jìn)去,并且直接返回True,表示第一次訪問
#     if ip not in self.VISIT_RECORD:
#       self.VISIT_RECORD[ip]=[ctime,]
#       # {'127.0.0.1':[時(shí)間1,時(shí)間1,]}
#       return True
#     # self.history=[時(shí)間1,時(shí)間1,]
#     self.history=self.VISIT_RECORD.get(ip)
#     # (3)循環(huán)判斷當(dāng)前ip的列表,有值,并且當(dāng)前時(shí)間減去列表的最后一個(gè)時(shí)間大于60s,把這種數(shù)據(jù)pop掉,這樣列表中只有60s以內(nèi)的訪問時(shí)間,
#     while self.history and ctime-self.history[-1]>60:
#       self.history.pop()
#     # (4)判斷,當(dāng)列表小于3,說明一分鐘以內(nèi)訪問不足三次,把當(dāng)前時(shí)間插入到列表第一個(gè)位置,返回True,順利通過
#     # (5)當(dāng)大于等于3,說明一分鐘內(nèi)訪問超過三次,返回False驗(yàn)證失敗
#     if len(self.history)<3:
#       self.history.insert(0,ctime)
#       return True
#     else:
#       return False

2. 使用

使用很簡(jiǎn)單,在需要進(jìn)行頻率控制的視圖類中定義一個(gè)屬性 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'] = '圖書沒有對(duì)象'
      response['status'] = 101
    return Response(response)

四 配置自定義頻率類

 1. 局部配置

其實(shí)上面的就是局部配置,

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. 局部禁用

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

throttle_classes = []

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

    Python讀寫文件基礎(chǔ)知識(shí)點(diǎn)

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

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

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

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

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

    TensorFlow進(jìn)階學(xué)習(xí)定制模型和訓(xùn)練算法

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

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

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

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

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

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

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

    Python裝飾器知識(shí)點(diǎn)補(bǔ)充

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

    Python3列表List入門知識(shí)附實(shí)例

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

最新評(píng)論