drf频率组件
Posted xufengnian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了drf频率组件相关的知识,希望对你有一定的参考价值。
1.简介
控制访问频率的组件
2.使用
手写一个自定义频率组件
import time #频率限制 #自定义频率组件,return True则可以访问,return False则不能访问 class MyThrottle(): visitor_dic={} def __init__(self): self.history=None def allow_request(self,request,view): ‘‘‘ {‘ip1‘:[时间1,时间2], ‘ip2‘:[时间1,], } ‘‘‘ # 基本原理 #1.取出访问者ip #2.判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走 #3.循环判断当前ip的列表,有值,并且当前时间减去最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间, #4.判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过 #5.当大于等于3,说明一分钟内访问超过三次,返回False验证失败 #META:请求所有的东西的字典 ip=request.META.get(‘REMOTE‘) print(ip) #不在字典中,说明是第一次访问 ctime=time.time() if ip not in self. visitor_dic: self.visitor_dic[ip]=[ctime,] return True #根据当前访问者ip,取出访问的时间列表 history=self.visitor_dic[ip] self.history=history while history and ctime -history[-1]>60: #pop默认是删除最后一项的 history.pop() if len(history)<3: #把当前时间放到第0个位置上, history.insert(0,ctime) return True return False #设定了访问频率,则要设定wait函数,返回的是剩余时间 def wait(self): ctime=time.time() return 60-(ctime-self.history[-1])
真正写一个频率组件
在settings里写配置
REST_FRAMEWORK={ ‘DEFAULT_THROTTLE_CLASS‘:[‘app01.MyAuth.MyThrottle‘,], ‘DEFAULT_THROTTLE_RATES‘:{‘aaa‘:‘3/m‘} }
在MyAuth进行定义
from rest_framework.throttling import SimpleRateThrottle class MyThrottle(SimpleRateThrottle): #scope要与settings里进行对应,可以找到限制的频率 scope=‘aaa‘ def get_cache_key(self, request, view): #内部做了啥事 #返回ip地址 #ip=request.META.get(‘REMOTE_ADDR‘) #return ip #这里返回的是ip,如果想限制域名,则下面返回的则需要是域名 return self.get_ident(request)
可以在views里进行重写错误信息
class Authors(APIView): throttle_classes = [MyAuth.MyThrottle, ] # authentication_classes = [MyAuth.LoginAuth,] # permission_classes = [MyAuth.UserPermission,] def get(self, request): response = {‘status‘: 100, ‘msg‘: ‘查询成功‘} ret = models.Author.objects.all() author_ser = MySer.AuthorSerializer(ret, many=True) response[‘data‘] = author_ser.data return JsonResponse(response, safe=False) # 重写错误显示信息 def throttled(self, request, wait): class MyThrottled(exceptions.Throttled): default_detail = ‘煞笔‘ extra_detail_singular = ‘还剩{wait}秒‘ extra_detail_plural = ‘还剩{wait}秒‘ raise MyThrottled(wait)
以上是关于drf频率组件的主要内容,如果未能解决你的问题,请参考以下文章