频率组件

频率组件

使用

​ 第一步:写一个频率类,继承SimpleRateThrottle,配置一个scop=字符串,重写get_cache_key,返回self.get_ident(request),

​ 第二步:在settings中配置

​ REST_FRAMEWORK = {

​ 'DEFAULT_THROTTLE_RATES': 'l字符串':'限制时间'

}

class Throttle(SimpleRateThrottle):
    scope = 'lxx'
    def get_cache_key(self, request, view):
        # return request.META.get('REMOTE_ADDR')
        #返回什么值,就以什么做过滤,返回用户id,就以用户id做过滤
        return self.get_ident(request)  # 这里返回的是ip

局部使用

在视图类中配置

class Book(APIView):
    throttle_classes = [MyThrottling,]
    def get(self,request):
        return Response('ok')
	
    # 报错中文信息,固定写法
        def throttled(self, request, wait):
        from rest_framework.exceptions import Throttled
        class MyThrottled(Throttled):
            default_detail = '访问次数过多'
            extra_detail_singular = '还有 {wait} second.'
            extra_detail_plural = '还剩 {wait} seconds.'

        raise MyThrottled(wait)

全局使用

在settings中配置

REST_FRAMEWORK={'DEFAULT_THROTTLE_CLASSES':['自己定义的频率类'],}

局部禁用

throttle_classes=[]

源码分析

核心代码

SimpleRateThrottle中的allow_request方法

获取scope字符串对应的限制频率

再进行切分拿到各自对应的值

posted @ 2019-07-05 08:41  ymg-颜  阅读(143)  评论(0编辑  收藏  举报