美文网首页
25_rest-framework之频率控制组件

25_rest-framework之频率控制组件

作者: knot98 | 来源:发表于2018-12-14 15:44 被阅读0次

rest-framework之频率控制组件

一、频率控制简介

为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次

二、自定义频率控制组件

自定义频率控制组件逻辑
(1)取出访问者ip
(2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
(3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
(4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
(5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败

MyThrottle.py 文件:
from rest_framework.throttling import BaseThrottle
import time


class MyThrottle(BaseThrottle):
    # 访问记录字典
    VISIT_RECORD = {}

    def __init__(self):
        # 记录当前ip所对应的访问记录列表
        self.history = None

    def allow_request(self, request, view):
        ip = request.META.get('REMOTE_ADDR')
        current_time = time.time()
        
        if ip not in self.VISIT_RECORD:
            self.VISIT_RECORD[ip] = [current_time, ]
            return True
        
        ip_list = self.VISIT_RECORD[ip]
        self.history = ip_list
        
        while ip_list and current_time - ip_list[-1] > 60:
            ip_list.pop()
            
        if len(ip_list) < 6:
            ip_list.insert(0, current_time)
            return True
        return False

    def wait(self):
        # 返回报错信息内的剩余时间
        current_time = time.time()
        return 60 - (current_time - self.history[-1])

二、 内置频率类

settings.py 文件配置:
REST_FRAMEWORK = { 
    # rest_framework 内置频率控制settings配置
    'DEFAULT_THROTTLE_RATES': {
        'hgq': '3/m'
    }
}
MyThrottle.py 文件:
from rest_framework.throttling import SimpleRateThrottle

class VisitThrottle(SimpleRateThrottle):
    # 对应 settings 配置文件中 DEFAULT_THROTTLE_RATES 的 key 值
    scope = 'hgq'
    # 重写父类 SimpleRateThrottle 的方法,返回当前访问的 ip
    # 过父类的父类(基类BaseThrottle)的get_identu获取ip
    def get_cache_key(self, request, view):
        return self.get_ident(request)

三、全局使用与局部使用

全局使用
REST_FRAMEWORK = {
    # 频率控制组件全局使用
    'DEFAULT_THROTTLE_CLASSES': ['app01.custom.MyThrottle.VisitThrottle', ],
    # rest_framework 内置频率控制settings配置
    'DEFAULT_THROTTLE_RATES': {
        'hgq': '3/m'
    }
}
局部使用
# 在views.py 中的试图类中加上

# rest_framework 内置频率控制局部使用
throttle_classes = [VisitThrottle, ]

四、错误信息的中文提示

在views.py 中的试图类中重写 APIViewthrottled方法
# 提示信息中文
def throttled(self, request, wait):
    class MyThrottled(exceptions.Throttled):
        default_detail = '傻逼'
        extra_detail_singular = '还剩 {wait} 秒.'
        extra_detail_plural = '还剩 {wait} 秒'

        raise MyThrottled(wait)

更多详细信息

相关文章

网友评论

      本文标题:25_rest-framework之频率控制组件

      本文链接:https://www.haomeiwen.com/subject/kjyghqtx.html