流量控制的逻辑:
1、设置一个唯一标识,作为cache的key
2、请求访问时,构造唯一标识,从ceche中获取[时间1,时间2,时间3,…]
3、根据设置流量控制规则,如:5/m (一分钟最多访问5次),判断该唯一标识记录到cache中的访问时间的次数,是否满足请求的条件
4、不满足,就抛出异常,前端收到请求过快的响应。满足访问,就直接访问。
一、代码的准备
视图:
class TestAPIView(APIView):
authentication_classes=[MyJWTAuthentication]
permission_classes = [AdminPermission,]
def get(self,request)
return Respponse({
'code':200,'msg':'测试通过'})
路由:
path('test/',views.TestAPIView.as_view())
请求方式:GET
流量控制类:
from rest_framework.throttling import SimpleRateThrottle
#对请求源的IP进行限制
class IPThrottle(SimpleRateThrottle):
# 在settings中配置频率时使用到的关键字,有scope来指定
scope = 'IP'
def get_cache_key(self, request, view):
return f'{self.scope}-{self.get_ident(request)}-throttle'
# 这里return什么,就以什么作为限制,这里限制ip,直接return ip就可以
return request.META.get('REMOTE_ADDR')
# 可以在这里设置访问频率
# def get_rate(self):
# return '3/m'
二、具体的流程
1、TestAPIView的as_view方法,当前实例对象没有,找父类的APIView的as_view
@classmethod
def as_view(cls, **initkwargs):
#1、调用APIView父类的as_view方法
view = super().as_view(**initkwargs)
view.cls = cls
view.initkwargs = initkwargs
#2、去除掉csrf校验
return csrf_exempt(view)
2、APIView的as_view是调用父类View的as_view方法
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
self.setup(request, *args, **kwargs)
if not hasattr(self, 'request'):
raise AttributeError(
"%s instance has no 'request' attribute. Did you override "
"setup() and forget to call super()?" % cls