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])
View Code

真正写一个频率组件

在settings里写配置

技术分享图片
REST_FRAMEWORK={
    DEFAULT_THROTTLE_CLASS:[app01.MyAuth.MyThrottle,],
    DEFAULT_THROTTLE_RATES:{aaa:3/m}
}
View Code

在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)
View Code

可以在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)
View Code

 

以上是关于drf频率组件的主要内容,如果未能解决你的问题,请参考以下文章

drf频率组件

DRF频率 񱆴

DRF频率 𒳼

DRF -- 频率组件 JWT使用

DRF频率 -- 2019-08-08 20:39:51

drf 频率组件使用