【DRF频率】 񱆴

目录

  • 使用自带的频率限制类
  • 使用自定义的频率限制类

原文: http://blog.gqylpy.com/gqy/292

"开发平台的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 = ["频率限制类", ]
"""

好了,就到这里吧.

"

原文: http://blog.gqylpy.com/gqy/292

原文地址:https://www.cnblogs.com/bbb001/p/11369038.html

时间: 2024-10-04 04:05:00

【DRF频率】 񱆴的相关文章

【DRF频率】 -- 2019-08-08 20:39:51

目录 使用自带的频率限制类 使用自定义的频率限制类 原文: http://106.13.73.98/__/67/ 开发平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. DRF就为我们提供了一些频率限制的方法. DRF中的版本.认证.权限.频率组件的源码是一个流程,且频率组件在最后执行. @ *** DRF频率组件原理 · DRF中的频率控制基本原理是基于访问次数和时间的,当然我们也可以通过自己定义的方法来实现. 当请求进来,走到我们的频率组件时,DRF内部会有一个字典来

DRF -- 频率组件 JWT使用

频率类源码 入口 # 1)APIView的dispath方法中的 self.initial(request, *args, **kwargs) 点进去 # 2)self.check_throttles(request) 进行频率认证 # 频率组件核心源码分析 def check_throttles(self, request): throttle_durations = [] # 1)遍历配置的频率认证类,初始化得到一个个频率认证类对象(会调用频率认证类的 __init__() 方法) # 2)

drf频率组件

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

DRF频率

一.频率源码分析 1.进入APIView的dispatch方法,里面的inital方法: 2.inital方法进行 3.获取自定义访问频率的内容 原文地址:https://www.cnblogs.com/king-home/p/11136166.html

DRF的权限和频率

DRF的权限 权限组件源码 权限和频率以及版本认证都是在initial方法里初始化的 我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 在rest_framework.permissions这个文件中~存放了框架给我们提供的所有权限的方法~~ 主要说下BasePermission 这个是我们写权限类继承的一个基础权限类~~~ 权限的详细用法 initial方法在初始化的时候是有顺序的:版本-->权限-->频率 写权限类 class MyPe

DRF 权限 频率

DRF的权限 权限是什么 大家之前都应该听过权限~那么我们权限到底是做什么用的呢~~ 大家都有博客~或者去一些论坛~一定知道管理员这个角色~ 比如我们申请博客的时候~一定要向管理员申请~也就是说管理员会有一些特殊的权利~是我们没有的~~ 这些对某件事情决策的范围和程度~我们叫做权限~~权限是我们在项目开发中非常常用到的~~ 那我们看DRF框架给我们提供的权限组件都有哪些方法~~ 权限组件源码 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其

DRF Django REST framework 之 频率,响应器与分页器组件(六)

频率组件 频率组件类似于权限组件,它判断是否给予请求通过.频率指示临时状态,并用于控制客户端可以向API发出的请求的速率. 与权限一样,可以使用多个调节器.API可能会对未经身份验证的请求进行限制,而对于经过身份验证的请求则进行限制较少. 例如,可以将用户限制为每分钟最多60个请求,每天最多1000个请求. 自定义频率组件 使用方式与权限,认证组件几乎相同 该方式没有DRF提供的方式简洁 import time import math from rest_framework import exc

drf框架 8 系统权限类使用 用户中心信息自查 token刷新机制 认证组件项目使用:多方式登录 权限组件项目使用:vip用户权限 频率组件 异常组件项目使用

系统权限类使用 图书接口:游客只读,用户可增删改查权限使用 from rest_framework.permissions import IsAuthenticatedOrReadOnly class BookViewSet(ModelViewSet): # 游客只读,用户可增删改查 permission_classes = [IsAuthenticatedOrReadOnly] queryset = models.Book.objects.all() serializer_class = se

DRF权限和频率限制

权限 views from rest_framework.permissions import BasePermission from rest_framework import exceptions # 权限类操作 class MyPermission(BasePermission): # 也是一种报错,返回给前端 message = {'code': 10001, 'error': '你没权限'} def has_permission(self, request, view): ""