【DRF频率】
开发平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用.
DRF就为我们提供了一些频率限制的方法.
DRF中的版本、认证、权限、频率组件的源码是一个流程,且频率组件在最后执行.
@
DRF频率组件原理
·
DRF中的频率控制基本原理是基于访问次数和时间的,当然我们也可以通过自己定义的方法来实现.
当请求进来,走到我们的频率组件时,DRF内部会有一个字典来记录访问者的IP.
以这个字典的IP为key,value为一个列表,存放访问者每次访问的时间:{PI1: [第三次访问时间, 第二次访问时间, 第一次访问时间, ]}
把每次访问的最新时间放入列表的最前面,记录这样一个数据结构后,通过如下方式限制:
·
如果我们设置的是10秒内只能访问5次:
- 判断访问者的IP是否在这个请求IP的字典里.
- 保证这个列表里都是都是最近10秒内访问的时间.
: 判断当前请求时间和列表里最早的(也就是最后一个)请求时间差
: 如果差大于10秒,说明请求不是最近10秒内的,删除掉最后一个
: 继续判断倒数第二个、第三个,直到差小于10秒为止- 判断列表的长度(即访问次数)是否大于我们设置的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 = ["频率限制类", ]
"""
好了,就到这里吧.
【DRF频率】的更多相关文章
- drf 频率组件 META字典详情
drf频率组件 什么是频率 控制用户对某个url的请求频率,比如一分钟之内,只能访问三次 自定义频率规则 1.取出访问者ip 2.判断当前ip在不在访问字典中: 不在,则添加进去,返回True; 3. ...
- DRF频率、分页、解析器、渲染器
DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...
- drf频率组件
1.简介 控制访问频率的组件 2.使用 手写一个自定义频率组件 import time #频率限制 #自定义频率组件,return True则可以访问,return False则不能访问 class ...
- DRF的认证,频率,权限
1,DRF的认证 初识认证:浏览器是无状态的,一次导致每次发的请求都是新的请求,所以每次请求,服务器都会进行校验,这样就很繁琐,这趟我们就需要给每一个用户登录后一个新的标识,浏览器每次都会带着这个唯一 ...
- DRF框架(七) ——三大认证组件之频率组件、jwt认证
drf频率组件源码 1.APIView的dispatch方法的 self.initial(request,*args,**kwargs) 点进去 2.self.check_throttles(re ...
- Django REST Framework(DRF)_第三篇
DRF版本控制 介绍 我们在看APIView源码时可以看到,版本和版本控制类是通过determine_version的返回值获取的 version, scheme = self.determine_v ...
- DRF之频率限制、分页、解析器和渲染器
一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...
- DRF框架之 用户角色权限与访问频率的权限设置
1. 简单演示,创建一个models的数据库表 class User(models.Model): name=models.CharField(max_length=32) pwd=models.Ch ...
- DRF 权限和频率
Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...
随机推荐
- 创建支持SSH服务的镜像
一.基于commit命令创建 docker commit CONTAINER [REPOSITORY [:TAG]] 1.使用ubuntu镜像创建一个容器 docker run -it ubuntu ...
- Java web application——基础
概述 一个WAR文件包含了构成一个Web应用程序所需要的文件.WAR文件作为一个单元部署在一个或多个WebLogic Server实例上. WebLogic Server上的Web存档始终包含以下文件 ...
- linux下搭建NFS服务器
服务端:10.6.191.183 客户端:10.6.191.182 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984 ...
- perl模块
查看perl模块安装目录:find `perl -e ‘print “@INC”‘` -name ‘*.pm’ -print 为什么要写或要模块呢?简言之:代码重用,更多见于写一组工具集,有很多地方是 ...
- qduoj~前端~二次开发
青岛大学qdu的onlinejudge是js的写的前端,框架是vue.js,在nodejs上部署运行,其实整体运行还是建立在docker的容器虚拟环境里,这里暂时不需要docker.安装环境是Ubun ...
- FZU 1202 信与信封问题 二分图匹配
找匹配中的关键边. 做法: 拆掉一条匹配边,然后对边两边的点做一次增广,如果可以增广,那么此边不是关键边,否则是关键边. 详情可以参见:http://www.docin.com/p-109868135 ...
- COGS——T 2478. [HZOI 2016]简单的最近公共祖先
http://www.cogs.pro/cogs/problem/problem.php?pid=2478 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单 ...
- sublime配置python
Sublime Text 2作为一款轻量级的编辑器,特点鲜明.方便使用,愈发受到普罗大众的喜爱.我个人近期也開始用了起来.同一时候,我近段时间还在学习Python的相关东西.所以開始用ST2来写Pyt ...
- FZOJ 2176 easy problem ( 树链剖分 )
pid=2176" target="_blank">题目链接~~> 做题感悟:感觉做多了树链剖分的题目,有很多是树链剖分 + 想法.. 解题思路: 这题非常明 ...
- 思科E3200 路由器 DD-WRT 设置花生壳和3322.org动态域名(DDNS)
花生壳设置(已測试) ddns.oray.com:80 username aaaa password bbbb 主机名 abc.gicp.net URL /ph/update?ho ...
