频率组件

Posted kai-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了频率组件相关的知识,希望对你有一定的参考价值。

频率组件

重点

  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


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

Python - 删除范围之间的特定频率

微信小程序代码片段

Matlab:在一帧音频数据中查找主要频率

频率组件

drf-jwt认证组件权限组件频率组件的使用

如何阻止片段一直弹出到根片段? [导航组件]