1、throttle
""" 系统: 1)AnonRateThrottle:对同一IP游客的限制 2)UserRateThrottle:对同一IP登录用户的限制 必须在settings.py中 'DEFAULT_THROTTLE_RATES': { 'user': '10/min', # 登录的用户一分钟可以访问10次 'anon': '3/min', # 游客一分钟可以访问3次 } 在视图类中: class TempAPIView(APIView): ... throttle_classes = [AnonRateThrottle, UserRateThrottle] 自定义:基于auth的Group与Permission表 1)自定义频率类,继承SimpleRateThrottle,重写get_cache_key,明确scope SimpleRateThrottle已经帮我们实现了 allow_request、wait 2)scope与settings.py的DEFAULT_THROTTLE_RATES配合使用 3)get_cache_key中完成 拿到限制信息 ident <= request中获取 没有限制信息 返回None => 不限制 有限制信息 返回限制信息字符串 => 有限制 """
2、自定义频率类:一分钟一个手机号只允许访问一次接口
代码:
from rest_framework.throttling import SimpleRateThrottle class ThreeMinRateThrottle(SimpleRateThrottle): scope = 'sms' def get_cache_key(self, request, view): # 对手机号频率限制 ident = request.data.get('mobile') if not ident: # 为发现限制条件,返回None代表不进行频率限制 return None return self.cache_format % { 'scope': self.scope, 'ident': ident } # settings.py 'DEFAULT_THROTTLE_RATES': { 'user': '10/min', # 登录的用户一分钟可以访问10次 'anon': '3/min', # 游客一分钟可以访问3次 'sms': '1/min', }
代码解读:
ThreeMinRateThrottle 是一个自定义的速率限制类,它继承自 Django REST framework 中的 SimpleRateThrottle 类。这个类主要用于实现针对手机号发送短信接口的频率限制策略。 在 get_cache_key 方法中: 首先尝试从请求的数据(request.data)中获取手机号码(mobile)作为客户端唯一标识符(ident)。 如果没有找到手机号码,则返回 None,这意味着不对此请求应用任何速率限制。 如果找到了手机号码,则根据指定的范围(scope,在这里为 'sms')和手机号码生成缓存键。这个缓存键将用于存储该特定手机在过去一段时间内的请求次数。 通过设置 THROTTLE_RATES 字典中的 'sms' 项,可以指定每三分钟内允许该手机号发送短信的最大请求次数。例如,在设置文件中添加以下内容: REST_FRAMEWORK = { ...
'THROTTLE_RATES': { 'sms': '3/min', # 表示每三分钟允许发送一次短信 },
... } 然后在需要进行短信发送速率限制的视图中引用此限流器:
from rest_framework.views import APIView
from .throttles import ThreeMinRateThrottle
class SmsSendView(APIView):
throttle_classes = [ThreeMinRateThrottle]
def post(self, request):
# 短信发送逻辑...
pass
标签:ident,限制,min,LL,cache,sms,频率,组件,scope
From: https://www.cnblogs.com/97zs/p/18070257