简介
节流(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,]
网友评论