目录
- 频率组件
- 频率组件项目使用:请求方式频率限制
频率组件
重点
- 如何自定义频率类
- 频率检验规则
- 自定义频率类时最常见的:短信接口一分钟只能发送一条
自定义频率类
- 自定义类继承 SimplerRateThrottle
- 设置类实现scope,值就是一个字符串,与settings中的DEFAULT_THROTTLE_RATES进行对应DEFAULT_THROTTLE_RATES就是设置scope绑定的类的频率规则:1/min 就代表一分钟只能访问一次
- 重写 get_cache_key(self, request, view) 方法,指定限制条件
不满足限制条件,返回None:代表对这类请求不进行频率限制
满足限制条件,返回一个字符串(是动态的):代表对这类请求进行频率限制
短信频率限制类,返回 "throttling_%(mobile)s" % {"mobile": 实际请求来的电话}
系统频率类
- UserRateThrottle: 限制所有用户访问频率
- 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
原文地址:https://www.cnblogs.com/kai-/p/12363204.html
时间: 2024-10-13 06:46:38