zoukankan      html  css  js  c++  java
  • 【DRF频率】

    开发平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用.

    DRF就为我们提供了一些频率限制的方法.
    DRF中的版本、认证、权限、频率组件的源码是一个流程,且频率组件在最后执行.

    @


    DRF频率组件原理
    ·
    DRF中的频率控制基本原理是基于访问次数和时间的,当然我们也可以通过自己定义的方法来实现.
    当请求进来,走到我们的频率组件时,DRF内部会有一个字典来记录访问者的IP.
    以这个字典的IP为key,value为一个列表,存放访问者每次访问的时间:{PI1: [第三次访问时间, 第二次访问时间, 第一次访问时间, ]}
    把每次访问的最新时间放入列表的最前面,记录这样一个数据结构后,通过如下方式限制:
    ·
    如果我们设置的是10秒内只能访问5次:

    1. 判断访问者的IP是否在这个请求IP的字典里.
    2. 保证这个列表里都是都是最近10秒内访问的时间.
      : 判断当前请求时间和列表里最早的(也就是最后一个)请求时间差
      : 如果差大于10秒,说明请求不是最近10秒内的,删除掉最后一个
      : 继续判断倒数第二个、第三个,直到差小于10秒为止
    3. 判断列表的长度(即访问次数)是否大于我们设置的5次.
      : 如果大于,则限制其访问
      : 如果小于,则放行,并把时间记录到列表的最前面

    使用自带的频率限制类

    首先 配置频率限制类

    from rest_framework.throttling import SimpleRateThrottle  #  导入内置的频率限制类
    
    class DRFThrottle(SimpleRateThrottle):
        """注意:这里都是必备的属性、方法和返回值"""
        scope = 'WD'
        def get_cache_key(self, request, view):
            # 拿IP地址
            return self.get_ident(request)
    

    然后 配置文件

    REST_FRAMEWORK = {
        # 指定频率限制的类
        "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.DRFThrottle'],
        # WD是scope定义的值,3/m表示每分钟不能超过3次访问
        "DEFAULT_THROTTLE_RATES": {"WD": "3/m"},
    }
    
    """
    如果只是想给单个视图做频率限制:
    则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项
    并在要做频率限制的视图中指定频率限制类即可
    指定语法:throttle_classes = ["频率限制类", ]
    """
    

    开始测试

    访问测试页面,连续刷新3次后,可看到:
    在这里插入图片描述


    使用自定义的频率限制类

    首先 自定义频率限制类

    import time
    
    VISIT_RECORD = {}  # 限制访问次数的字典
    
    class MyThrottle():
        """
        自定义频率限制类,一分钟允许访问5次
        注意:自定义频率限制类中必须要有allow_request和wait方法
        前者用于频率限制的逻辑,后者用于返回限制时间还剩多少秒
        """
    
        def __init__(self):
            self.history = []
    
        def allow_request(self, request, view):
            """用于限制访问的逻辑"""
            # 获取用户的IP地址
            ip = request.META.get('REMOTE_ADDR')
            if ip not in VISIT_RECORD:
                VISIT_RECORD[ip] = [time.time(), ]
            else:
                history = VISIT_RECORD[ip]
                self.history = history
                history.insert(0, time.time())
                # 确保访问时间在允许范围之内
                while self.history[0] - self.history[-1] > 60:
                    self.history.pop()
                # 确定访问次数在允许的范围内
                if len(self.history) >= 5:
                    return False
            return True
    
        def wait(self):
            """用于返回限制时间还剩多少秒"""
            return 60 - (self.history[0] - self.history[-1])
    

    然后 配置文件

    REST_FRAMEWORK = {
        # 指定自定义的频率限制类
        "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.MyThrottle'],
    }
    
    > """
    如果只是想给单个视图做频率限制:
    则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项
    并在要做频率限制的视图中指定频率限制类即可
    指定语法:throttle_classes = ["频率限制类", ]
    """
    

    好了,就到这里吧.

  • 相关阅读:
    OpenJudge计算概论-四大湖
    OpenJudge计算概论-排队游戏【这个用到了栈的思想】
    OpenJudge计算概论-流感传染【这个题用二维数组】
    OpenJudge计算概论-扩号匹配问题【这个用到了栈的思想】
    Openjudge计算概论-角谷猜想
    OpenJudge计算概论-发票统计
    OpenJudge计算概论-Tomorrow never knows【输入日期计算下一天的日期】
    已知二叉树的中序和前序序列(或后序)求解树
    OpenJudge计算概论-寻找下标
    OpenJudge计算概论-校门外的树
  • 原文地址:https://www.cnblogs.com/zyk01/p/10176383.html
Copyright © 2011-2022 走看看