zoukankan      html  css  js  c++  java
  • 频率组件

    频率组件

    重点

    1. 如何自定义频率类
    2. 频率检验规则
    3. 自定义频率类时最常见的:短信接口一分钟只能发送一条

    自定义频率类

    1. 自定义类继承 SimplerRateThrottle

    2. 设置类实现scope,值就是一个字符串,与settings中的DEFAULT_THROTTLE_RATES进行对应DEFAULT_THROTTLE_RATES就是设置scope绑定的类的频率规则:1/min 就代表一分钟只能访问一次

    3. 重写 get_cache_key(self, request, view) 方法,指定限制条件

      不满足限制条件,返回None:代表对这类请求不进行频率限制

      满足限制条件,返回一个字符串(是动态的):代表对这类请求进行频率限制

      短信频率限制类,返回 "throttling_%(mobile)s" % {"mobile": 实际请求来的电话}

    系统频率类

    1. UserRateThrottle: 限制所有用户访问频率
    2. AnonRateThrottle:只限制匿名用户访问频率

    频率组件项目使用:请求方式频率限制

    throttles.py

    from rest_framework.throttling import SimpleRateThrottle
    # 只限制查接口的频率,不限制增删改的频率
    class MethodRateThrottle(SimpleRateThrottle):
        scope = 'method'
        def get_cache_key(self, request, view):
            # 只有对get请求进行频率限制
            if request.method.lower() not in ('get', 'head', 'option'):
                return None
    
            # 区别不同的访问用户,直接的限制是不冲突的
            if request.user.is_authenticated:
                ident = request.user.pk
            else:
                # get_ident是BaseThrottle提供的方法,会根据请求头,区别匿名用户,
                # 保证不同客户端的请求都是代表一个独立的匿名用户
                ident = self.get_ident(request)
            return self.cache_format % {'scope': self.scope, 'ident': ident}
    

    settings.py

    REST_FRAMEWORK = {
        #  ...
        # 频率规则配置
        'DEFAULT_THROTTLE_RATES': {
            # 只能设置 s,m,h,d,且只需要第一个字母匹配就ok,m = min = maaa 就代表分钟
            'user': '3/min',  # 配合drf提供的 UserRateThrottle 使用,限制所有用户访问频率
            'anon': '3/min',  # 配合drf提供的 AnonRateThrottle 使用,只限制匿名用户访问频率
            'method': '3/min',
        },
    }
    

    views.py

    from .permissions import IsVipUser
    from .throttles import MethodRateThrottle
    class CarViewSet(ModelViewSet):
        permission_classes = [IsVipUser]
        throttle_classes = [MethodRateThrottle]
    
        queryset = models.Car.objects.all()
        serializer_class = serializers.CarSerializer
    

  • 相关阅读:
    javascript设计模式——链式模式学习
    浏览器debug常用技巧
    前端到底要不要学后台
    坑爹的JS闭包,怎么去理解才是正确的
    如何更加简单的理解JS中的原型原型链概念
    前端那么多框架,我们到底学哪一个
    大前端之——数据交互
    随便写一点自己对前端的感受
    如何手动使用webpack搭建一个react项目
    浅谈 CSS 预处理器: 为什么要使用预处理器?
  • 原文地址:https://www.cnblogs.com/kai-/p/12363204.html
Copyright © 2011-2022 走看看