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

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

  1. def check_throttles(self, request):
  2. """
  3. Check if request should be throttled.
  4. Raises an appropriate exception if the request is throttled.
  5. """
  6. for throttle in self.get_throttles():
  7. if not throttle.allow_request(request, self):
  8. self.throttled(request, throttle.wait())

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

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

  1. import time
  2. from rest_framework.throttling import BaseThrottle
  3.  
  4. class MyThrottle(BaseThrottle):
  5. visited_record = {}
  6.  
  7. def __init__(self):
  8. self.history = None
  9.  
  10. def allow_request(self, request, my_cbv):
  11.  
  12. # 这个my_cbv是源码中传的我们的视图类,这里我们也要传进去
  13. # print(self.get_ident(request)) # 可以获取本次请求的ip
  14. ip = request.META.get("REMOTE_ADDR")
  15. if ip not in self.visited_record:
  16. self.visited_record[ip] = []
  17.  
  18. current_time = time.time()
  19. history = self.visited_record[ip]
  20. self.history = history
  21.  
  22. while history and current_time - history[-1] > 60: # 把与当前访问时间相差大于60秒的时间都删掉
  23. history.pop()
  24.  
  25. if len(history) > 2: # 第三次访问,列表中只有2个值,也满足条件,大于2个值时不满足条件
  26. return False
  27. history.insert(0, current_time)
  28. return True
  29.  
  30. def wait(self):
  31. """
  32. 用于返回还剩多少时间访问;
  33.  
  34. 本次访问时间:9:50:55
  35. [09:50:30, 09:50:20, 09:50:10] 剩余 60 - (9:50:55 - 09:50:10)秒才能访问
  36. :return:
  37. """
  38. c_time = time.time()
  39. return 60 - (c_time - self.history[-1])

视图类:

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

效果如下:

可以在全局settings配置

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_PARSER_CLASSES': (
  3. 'rest_framework.parsers.JSONParser',
  4. 'rest_framework.parsers.FormParser',
  5. 'rest_framework.parsers.MultiPartParser'
  6. ),
  7. 'DEFAULT_AUTHENTICATION_CLASSES':
  8. 'app01.utils.auth_class.UserAuth',
  9. ),
  10. 'DEFAULT_PERMISSION_CLASSES': (
  11. 'app01.utils.permission_class.VipPermission',
  12. ),
  13. 'DEFAULT_THROTTLE_CLASSES': (
  14. 'app01.utils.throttle_class.MyThrottle',
  15. ),
  16. }

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

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

基于限制ip的类:SimpleRateThrottle

基于ip的访问限制:

频率类——局部:

  1. from rest_framework.throttling import SimpleRateThrottle
  2.  
  3. class MyThrottle(SimpleRateThrottle):
  4.  
  5. rate = '5/m'
  6.  
  7. def get_cache_key(self, request, view): # 这个方法也是必须要有
  8. return self.get_ident(request)

在视图类中指定频率类

  1. class BookView(ModelViewSet):
  2.  
  3. throttle_classes = [app_throttles.RateThrottle]
  4.  
  5. queryset = Book.objects.all()
  6. serializer_class = BookSerializer
  1. duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}

频率类——全局:

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

这次只能在setttings中配置:

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

Rest_Framework之频率组件部分的更多相关文章

  1. Django的rest_framework的权限组件和频率组件源码分析

    前言: Django的rest_framework一共有三大组件,分别为认证组件:perform_authentication,权限组件:check_permissions,频率组件:check_th ...

  2. Rest_Framework之认证、权限、频率组件源码剖析

    一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...

  3. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  4. 前后端分离djangorestframework——限流频率组件

    频率限制 什么是频率限制 目前我们开发的都是API接口,且是开房的API接口.传给前端来处理的,也就是说,只要有人拿到这个接口,任何人都可以通过这个API接口获取数据,那么像网络爬虫的,请求速度又快, ...

  5. rest-framework频率组件

    throttle(访问频率)组件 1.局部视图throttle from rest_framework.throttling import BaseThrottle VISIT_RECORD={} c ...

  6. rest_framework视图和组件

    一.视图 1.基本视图 #基本视图 #抽取基类 from rest_framework.response import Response from rest_framework.views impor ...

  7. drf频率组件

    1.简介 控制访问频率的组件 2.使用 手写一个自定义频率组件 import time #频率限制 #自定义频率组件,return True则可以访问,return False则不能访问 class ...

  8. day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  9. DRF(5) - 频率组件、url注册器、响应器、分页器

    一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...

随机推荐

  1. springmvc(二)

    请求信息转换 异步发送表单数据到JavaBean,并响应JSON文本返回 操作步骤:(1)加入Jackson2或fastjson框架包,springmvc默认支持Jackon2,不需要做任何操作,而f ...

  2. 玩转 SpringBoot 2 之整合 JWT 下篇

    前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 ...

  3. Spring Boot (八): Mybatis 增强工具 MyBatis-Plus

    1. 简介 在上一篇文章<Spring Boot (七): Mybatis极简配置> 中我们介绍了在 Spring Boot 中 Mybatis 的基础使用方式,其中有一部分美中不足的是 ...

  4. WCF尝试创建与发布IIS(含问题描述)

    技术贴技术贴就直接讲技术来,客套的话我也不多说了,各位看官包涵包涵. 跟着园内高手一步一步发布成功,欣喜若狂之际,发个贴纪念纪念一下. 废话不多说,不正确之处,还望大家积极指出,共同进步.哈哈~~~ ...

  5. 【SpingBoot】spring静态工具类注入问题

    package cn.zwqh.action; import javax.annotation.PostConstruct; import javax.annotation.Resource; imp ...

  6. python程序设计基础(嵩天)第五章课后习题部分答案

    第五章p1515.2:实现isodd()函数,参数为整数,如果参数为奇数,返回true,否则返回false.def isodd(s): x=eval(s) if(x%2==0): return Fal ...

  7. Nebula 架构剖析系列(零)图数据库的整体架构设计

    Nebula Graph 是一个高性能的分布式开源图数据库,本文为大家介绍 Nebula Graph 的整体架构. 一个完整的 Nebula 部署集群包含三个服务,即  Query Service,S ...

  8. nrm的安装与使用

    nrm的作用:提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址:,我们依旧使用的事npm的命令,只是镜像地址变了 什么是镜像:原来包刚一开始是只存在于国外的NPM服务器, ...

  9. Python玩转人工智能最火框架 TensorFlow应用实践 ☝☝☝

    Python玩转人工智能最火框架 TensorFlow应用实践 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 全民人工智能时代,不甘心只做一个旁观者,那就现在 ...

  10. MySQL索引的建立与实现

    一.索引介绍 1.MySQL中,所有的数据类型都可以被索引,索引包括普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引等. 2.额外的:我已知的自动创建索引的时机:创建主键,唯一,外键约束的 ...