一、RestFramework之频率组件源码部分

频率组件的源码部分和权限组件流程一模一样的,这里就不多说了,直接上源码的主要逻辑部分:

def check_throttles(self, request):"""Check if request should be throttled.Raises an appropriate exception if the request is throttled."""for throttle in self.get_throttles():if not throttle.allow_request(request, self):self.throttled(request, throttle.wait())

明确表示我们写的频率类需要一个allow_request()方法:

频率类(完成一分钟同一个ip只能访问三次):

import time
from rest_framework.throttling import BaseThrottleclass MyThrottle(BaseThrottle):visited_record = {}def __init__(self):self.history = Nonedef allow_request(self, request, my_cbv):# 这个my_cbv是源码中传的我们的视图类,这里我们也要传进去# print(self.get_ident(request))  # 可以获取本次请求的ipip = request.META.get("REMOTE_ADDR")if ip not in self.visited_record:self.visited_record[ip] = []current_time = time.time()history = self.visited_record[ip]self.history = historywhile history and current_time - history[-1] > 60:  # 把与当前访问时间相差大于60秒的时间都删掉
            history.pop()if len(history) > 2:  # 第三次访问,列表中只有2个值,也满足条件,大于2个值时不满足条件return Falsehistory.insert(0, current_time)return Truedef wait(self):"""用于返回还剩多少时间访问;本次访问时间:9:50:55[09:50:30, 09:50:20, 09:50:10]   剩余 60 - (9:50:55 - 09:50:10)秒才能访问:return:"""c_time = time.time()return 60 - (c_time - self.history[-1])  

视图类:

class BookView(ModelViewSet):authentication_classes = [UserAuth]      #认证类permission_classes = [UserPerm]        #权限类throttle_classes = [MyThrottle]      #频率类queryset = Book.objects.all()serializer_class = BookSerializer

效果如下:

可以在全局settings配置

REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ('rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser'),'DEFAULT_AUTHENTICATION_CLASSES': 'app01.utils.auth_class.UserAuth',),'DEFAULT_PERMISSION_CLASSES': ('app01.utils.permission_class.VipPermission',),'DEFAULT_THROTTLE_CLASSES': ('app01.utils.throttle_class.MyThrottle',),
}

二、使用restframework组件中的提供的访问限制

实现方式和我们上面的方式基本相同;

基于限制ip的类:SimpleRateThrottle

基于ip的访问限制:

频率类——局部:

from rest_framework.throttling import SimpleRateThrottleclass MyThrottle(SimpleRateThrottle):rate = '5/m'def get_cache_key(self, request, view):  # 这个方法也是必须要有return self.get_ident(request)

在视图类中指定频率类

class BookView(ModelViewSet):throttle_classes = [app_throttles.RateThrottle]queryset = Book.objects.all()serializer_class = BookSerializer

 duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}

频率类——全局:

from rest_framework.throttling import SimpleRateThrottleclass MyThrottle(SimpleRateThrottle):scope = "visit_rate"  # 这个值决定了在配置时使用哪个变量描述限制的频率,必须在settings里面配置def get_cache_key(self, request, view):  # 这个方法也是必须要有return self.get_ident(request)

这次只能在setttings中配置:

REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ('app01.utils.throttle_class.MyThrottle',),"DEFAULT_THROTTLE_RATES": {"visit_rate": "10/m",   # 这个参数就是频率类中定义的那个参数scope, 其中第一个数字10表示10次,后面的m表示一分钟,还有s,一秒, h, 一小时, d, 一天
    }
}

 duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}

转载于:https://www.cnblogs.com/fengchong/p/10100488.html

Rest_Framework之频率组件部分相关推荐

  1. python_restframework(频率组件)

    BaseThrottle (1) 取出访问者ip (2) 判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走 (3) 循环判断当前ip的列表,有值,并且当 ...

  2. Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)

    阅读目录 一.认证组件 使用方法: token简单描述: 应用token编写登录接口: 二.权限组件 使用方法: 三.频率组件 使用方法: 一.认证组件 回到顶部 使用方法: ①写一个认证类,新建文件 ...

  3. Django REST framework 认证、权限和频率组件

    认证与权限频率组件 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制.然后 权限 和 限制 组件决定是否拒绝这个请求. 简单来说就是: 认证确定了你是谁 权限确定你能 ...

  4. drf 频率组件 META字典详情

    drf频率组件 什么是频率 控制用户对某个url的请求频率,比如一分钟之内,只能访问三次 自定义频率规则 1.取出访问者ip 2.判断当前ip在不在访问字典中:不在,则添加进去,返回True; 3.循 ...

  5. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    阅读目录 认证组件 权限组件 频率组件 认证组件 权限组件 频率组件

  6. Django里rest_framework的视图组件generics进行优化视图

    使用视图组件进行接口优化 使用视图组件的generics进行接口逻辑优化 导入generics from rest_framework import generics 定义序列化类 class Boo ...

  7. rest_framework之组件大长今

    功能导入快捷查询: from rest_framework import serializers # 序列化from rest_framework.routers import SimpleRoute ...

  8. drf6 权限和频率控制组件

    对某件事情决策的范围和程度,我们叫做权限,权限是我们在项目开发中非常常用到的. DRF框架给我们提供的权限组件 权限组件 之前DRF的版本和认证,知道了权限和频率跟版本认证都是在initial方法里初 ...

  9. drf5 版本和认证组件

    开发项目是有多个版本的 随着项目的更新,版本就越来越多.不可能新的版本出了,以前旧的版本就不进行维护了 那我们就需要对版本进行控制,这个DRF框架也给我们提供了一些封装好的版本控制方法 版本控制组件 ...

最新文章

  1. aspen串联反应怎么输入_【精】反应器(反应釜)的结构和工作原理
  2. CentOS使用yum安装Docker
  3. 101. Leetcode 139. 单词拆分 (动态规划-完全背包)
  4. 马尔科夫网络和一阶马尔科夫链
  5. java action上传文件_java实现文件上传
  6. Silverlight 3D开源项目,取材于CodePlex和微软的开源项目,主要是更新至Silverlight RTM版...
  7. Java 类型和数据库类型怎么实现相互映射?
  8. 在Linux中查看ftp状态,linux中ftp常见操作启动ftp状态,终止ftp会话
  9. boost——windows下VS2013update5编译boost库
  10. CWP中的排序算法:C语言
  11. 10G整数文件中寻找中位数或者第K大数
  12. FISCO BCOS Solidity 使用Table合约CRUD接口 智能合约例子
  13. TongWeb部署Dm数据库的项目报错
  14. reactos操作系统实现(108)
  15. qj71c24n通讯实例_通信模块QJ71C24N应用篇手册三菱QJ71C24N用户手册 - 广州凌控
  16. 嵌入式算法19---国家商用密码SM算法
  17. 设计师该如何把简历写好?
  18. git报错 warning: Clone succeeded, but checkout failed.
  19. 根据区的code获取省市的code代码,下面有切割数字方法
  20. php编辑菱形图案代码,vb怎么输出菱形图案?vb绘制菱形的教程

热门文章

  1. xbox虚拟服务器,Xbox One平台真相:原生Win8/虚拟化运行
  2. 线程被中断跟被阻塞有什么区别_宠物加盟店跟自营店有什么区别
  3. python 对比文件内容差异_使用Python来比较文件夹并提取差异部分
  4. oracle安装后开机很慢,Windows下安装Oracle拖慢开机速度的解决方法
  5. maven中的oracle,maven中安装SQL SERVER 和 Oracle JDBC驱动
  6. lisp scheme 果壳_走出Lisp(Scheme)困境
  7. 电脑向linux服务器传输文件,windows如何通过ssh工具向linux服务器上传和下载文件?...
  8. python 电脑显示桌面_使用Python快速实现显示器关闭和锁住桌面
  9. matlab各个指令的含义,[MATLAB基础] 求解这段指令的意思,越详细越好,谢谢啦
  10. 重叠面积_重叠面积——动点产生的重叠面积问题