1 频率组件
#自定义组件写频率认证(重点继承BaseThrottle) from rest_framework.throttling import BaseThrottle import time class Thro(BaseThrottle): dic={} def allow_request(self, request, view): ''' :param request: :param view: :return: 布尔类型 ''' ctime=time.time() self.ip=request.META.get('REMOTE_ADDR') if self.ip and self.ip not in self.dic: self.dic[self.ip]=[ctime] return True lis=self.dic.get(self.ip) #把最早的时间和现在时间对比 1.大于多少秒(60s)的去掉 2.留下的是多少秒内(60秒内)的时间数 = 访问次数 while lis and ctime-lis[-1]>60: lis.pop() #剩下的时间列表 1.在多少秒内(60s内)2.设置访问次数:列表内时间个数=限制范文次数 if len(lis)<6: lis[:0]=[ctime] print (self.dic) return True print(self.dic) return False #访问超过限制触发 def wait(self): ''' :return:多少秒过后才可以访问 ''' #最早的时间 tim=self.dic.get(self.ip)[-1] ctime=time.time() #ctime-tim 值越来越大 return 60-(ctime-tim) #局部使用 throttle_classes=[Thro,] #全局使用 REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ['app01.Mythrottle.Thro', ], }
#settings REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ['app01.Mythrottle.Thro', ], 'DEFAULT_THROTTLE_RATES': { #self.scope : self.rate 'keykey': '6/m' #1分钟最大访问次数为6 } } #定义一个频率组件类(重点继承SimpleRateThrottle) class Thro(SimpleRateThrottle): scope = 'keykey' def get_cache_key(self, request, view): # 返回ip地址 # ip=request.META.get('REMOTE_ADDR') # return ip return self.get_ident (request)
class Books(APIView): #apiview的方法 # def throttled(self, request, wait): # """ # If request is throttled, determine what kind of exception to raise. # """ #源码:实例话了一个对象,我们只需要把这个 数据属性的英文错误改成中文 #中文显示:让后再让我们自定义类的对象调父类的ini方法 # raise exceptions.Throttled (wait) #改中文 def throttled(self, request, wait): from rest_framework import exceptions class sss(exceptions.Throttled): default_detail = '访问限制' extra_detail_singular = '{wait}秒解除限制' extra_detail_plural = 'Expected available in {wait} seconds.' raise sss(wait) def get(self,request): response={'status':100,'msg':'请求成功'} books=models.Book.objects.all() ser=Myserializers.Books(books,many=True) response['data']=ser.data return JsonResponse(response,safe=False)
2 解析器
作用:传过来的数据,解析成字典 使用: 局部使用: from rest_framework.parsers import JSONParser,FormParser 在视图类中: parser_classes = [FormParser,] 全局使用 REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES':[ 'rest_framework.parsers.JSONParser' ] } 局部使用指定的解析器: 在视图类中: parser_classes = [FormParser,]