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

 

 
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。