Rest_Framework之频率组件部分
一、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 BaseThrottle class MyThrottle(BaseThrottle):
visited_record = {} def __init__(self):
self.history = None def allow_request(self, request, my_cbv): # 这个my_cbv是源码中传的我们的视图类,这里我们也要传进去
# print(self.get_ident(request)) # 可以获取本次请求的ip
ip = 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 = history while history and current_time - history[-1] > 60: # 把与当前访问时间相差大于60秒的时间都删掉
history.pop() if len(history) > 2: # 第三次访问,列表中只有2个值,也满足条件,大于2个值时不满足条件
return False
history.insert(0, current_time)
return True def 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 SimpleRateThrottle
class 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 SimpleRateThrottle
class 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}
Rest_Framework之频率组件部分的更多相关文章
- Django的rest_framework的权限组件和频率组件源码分析
		
前言: Django的rest_framework一共有三大组件,分别为认证组件:perform_authentication,权限组件:check_permissions,频率组件:check_th ...
 - Rest_Framework之认证、权限、频率组件源码剖析
		
一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...
 - DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
		
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
 - 前后端分离djangorestframework——限流频率组件
		
频率限制 什么是频率限制 目前我们开发的都是API接口,且是开房的API接口.传给前端来处理的,也就是说,只要有人拿到这个接口,任何人都可以通过这个API接口获取数据,那么像网络爬虫的,请求速度又快, ...
 - rest-framework频率组件
		
throttle(访问频率)组件 1.局部视图throttle from rest_framework.throttling import BaseThrottle VISIT_RECORD={} c ...
 - rest_framework视图和组件
		
一.视图 1.基本视图 #基本视图 #抽取基类 from rest_framework.response import Response from rest_framework.views impor ...
 - drf频率组件
		
1.简介 控制访问频率的组件 2.使用 手写一个自定义频率组件 import time #频率限制 #自定义频率组件,return True则可以访问,return False则不能访问 class ...
 - day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
		
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
 - DRF(5) - 频率组件、url注册器、响应器、分页器
		
一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...
 
随机推荐
- Django基础五之django模型层之关联管理器
			
class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: ForeignKey关系的“另一边”.像这样: 1 ...
 - ELK 学习笔记之 Kibana入门使用
			
Kibana入门使用: 第一次导入索引: 修改展示时间,不然查不到数据: 点Discover,查阅数据: 如果要添加新的index: 点击Visualize, 创建chart: 点击Dashboard ...
 - MongoDB 学习笔记之 基本CRUD
			
Mongo 命令: show databases/dbs; use test; show tables/collections; db.help() db.createCollection('user ...
 - win10  php安装redis 扩展
			
redis下载:https://github.com/MicrosoftArchive/redis/releases 我下载的是zip包,下载后安装redis. 开始安装php的reids扩展 查看p ...
 - 31、vue-cli3引入封装svg图标
			
svg图标放大不失真,png会出现失真现象. 一.方法一 1.在对应vue项目里添加插件 vue add svg-sprite 输入 Y 2.在执行 npm install svgo svgo-loa ...
 - 2019.10.15 CSP初赛知识点整理
			
初赛需要的知识点整理如下: (1)计算机的硬件组成与基本常识 (2)单位/进制的转换 (3)进制/逻辑运算相关 (4)概率与期望 (5)排序的各种性质 (6)简单数据结构的使用(栈.队列.链表等) ( ...
 - hash长度扩展攻击
			
这里面就放一张百度百科的解释吧,emmm 反正我是看不懂还是做一下题来巩固一下吧 CTF中的hash长度攻击 进入网页你会发现页面显示  我这里没有看到什么可以利用的,抓了一下包也没有什么有可以利 ...
 - 性能测试:Jmeter压测过程中的短信验证码读取
			
问题背景 现如今国内的大部分软件或者网站应用,普遍流行使用短信业务,比如登录.注册以及特定的业务通知等. 对于这些业务,在使用Jmeter进行性能测试的过程中,就会需要自动获取和填入短信验证码,否则性 ...
 - Python从入门到精通视频(全60集)  ☝☝☝
			
Python从入门到精通视频(全60集) Python入门到精通 学习 教程 首先,课程的顺序需要调整:一和三主要是介绍学习和布置开发环境的,一介绍的是非VS开发,三介绍的是VS开发.VS2017现在 ...
 - 算法学习之剑指offer(九)
			
一 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). public class Solution ...