频率组件
使用
第一步:写一个频率类,继承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字符串对应的限制频率
再进行切分拿到各自对应的值