DRF十大组件之节流

简介

节流(Throttling)类似于权限,因为它决定了是否应该对请求进行授权。节流表示一个临时状态,并用于控制客户端对API的请求率。
与认证一样,可以使用多个节流。对于未经身份验证的请求,您的API可能会有一个限制节流阀,而对于经过身份验证的请求,则会有一个更小的节流阀。
另一个可能需要使用多个节流的场景是,如果您需要对API的不同部分施加不同的约束,因为某些服务特别占用资源。
如果您想要同时强制实施节流率和持续的节流率,那么多节流也可以使用。例如,您可能希望将用户限制为每分钟60次请求,每天1000次请求。
节流不一定只涉及到速率限制的请求。例如,存储服务可能还需要对带宽进行节流,而付费数据服务可能希望对访问的某些记录进行节流。

首先我们可以先编写一个类

class VisitThrottle(object):
    '''实现节流的逻辑'''
    def allow_request(self, request, view):
        return True  # False表示访问频率太高被限制
    def wait(self):
        return None    

allow_request 这个是处理我们这个用户到底访问了多少次,如果到达阀值,我们就不让它访问,如果没有到达,我们就让他继续访问
wait 这个就是加入到达了这个阀值,我们还需要等待多少秒,才可以继续访问

先写一个字典,装用户的访问记录 VISIT_RECORD = {}
第一种方法基于ip做节流,
获取用户访问的IP地址
ip_address = request._request.META.get('REMOTE_ADDR')
这个方法是按住Ctrl然后按BaseThrottle
from rest_framework.throttling import BaseThrottle,SimpleRateThrottle
这个里面有个def get_ident(self, request):方法,
然后我们就看到了remote_addr = request.META.get('REMOTE_ADDR')

ctime = time.time()
#         if ip_address not in VISIT_RECORD:
#             #第一次访问的时候将访问的时间存储在字典中(ip地址为Key,访问的时间为value值)
#             VISIT_RECORD[ip_address] = [ctime,]

然后在字典里取值

第二次访问的时候取出访问的历史记录
  history = VISIT_RECORD[ip_address]

然后进行判断

if username not in VISIT_RECORD:
#         #     VISIT_RECORD[username] = [ctime, ]
#         # history = VISIT_RECORD[username]
#         self.history = history
#
#         while history and history[-1] < ctime - 10:
#             """如果访问的时间记录超过60秒,就把超过60秒的时间记录移除"""
#             history.pop()
#
#         if len(history) < 6:
#             history.insert(0,ctime)
#             return True
#
#         return False

按住Ctrl然后点APIView
设置节流 throttle_classes

throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES

throttle_classes设置节流类

#throttle_classes = [VisitThrottle,]

你可能感兴趣的:(DRF十大组件之节流)