DRF 用户频率限制
DRF 用户频率限制
为什么要限流
1 防爬虫
匿名用户 无法限制,代理
已登录,用户名限制;买代理
2 提供服务(接口--不同用户的访问次数不一样)
vip 限制访问次数
BaseThrottle 自定义 allow_reques,wait t实现用户 ip 访问限制
RECORD = {} # 定义在全局的 记录(记录ip访问)
class MyThrottle(BaseThrottle):
def allow_request(self,request,view):
"""
:param request:
:param view:
:return:
"""
'''
a. 对匿名用户进行限制,每个用户1分钟只允许访问10次
--获取用户IP
'''
import time
ctime = time.time()
ip = self.get_ident(request) # 获取 ip地址
if ip not in RECORD:
RECORD[ip] = [ctime,]
else:
time_list = RECORD[ip]
while True:
first_time = time_list[-1]
if ctime - 60 > first_time:
time_list.pop()
else:
break
if len(time_list) > 10:
return False
time_list.insert(0,ctime)
return True
def wait(self): # 显示剩余时间
ip = self.get_ident()
ip_list = RECORD[ip]
import time
ctime = time.time()
remain_time = 60 - ctime + ip_list[-1]
return remain_time
继承 SimpleRateThrottle -- get_cache_key实现
class MySimpleThrottle(SimpleRateThrottle):
scope = 'WDP' # 配置 'DEFAULT_THROTTLE_RATES':{'WDP':'3/m'}
def get_cache_key(self, request, view):
return self.get_ident(request) # 设置 ip 为 cache记录的 key
settings 中
REST_FRAMEWORK = {
'UNAUTHENTICATED_USER':None,
'UNAUTHENTICATED_TOKEN':None,
# 'DEFAULT_AUTHENTICATION_CLASSES':[
# 'goods.utils.MyAuthentication'
# ],
'DEFAULT_THROTTLE_RATES':{
'WDP':'3/m'
}
}
DRF 的 ip 访问 记录默认放在 cache中,可以通过配置文件 修改缓存方式
返回ip(匿名),或者user(登录)
class AnonyThrottle(SimpleRateThrottle):
scope = 'WDP_ANONNY' # 配置 'DEFAULT_THROTTLE_RATES':{'WDP':'3/m'}
def get_cache_key(self, request, view):
if request.user:
return None
return self.get_ident(request) # 设置 ip 为 cache访问记录的 key
class UserThrottole(SimpleRateThrottle):
scope = 'WDP_USER'
def get_cache_key(self, request, view):
if request.user:
return request.user # 设置 user 为cache访问记录的key
return None
class VIPThrottole(SimpleRateThrottle):
scope = 'WDP_VIP'
def get_cache_key(self, request, view):
if request.user and request.user == 'ale':
return request.user
return None
IP 访问控制的 提示信息
def throttled(self, request, wait):
"""
If request is throttled, determine what kind of exception to raise.
"""
class MyThrottole(exceptions.Throttled):
default_detail = '限制访问.'
extra_detail_singular = '需要再等 {wait} 秒.'
extra_detail_plural = '需要再等 {wait} 秒.'
raise MyThrottole(wait)
获取请求的IP
request.META.get('REMOTE_ADDR')
DRF 用户频率限制的更多相关文章
- DRF之频率限制、分页、解析器和渲染器
一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...
- DRF 权限 频率
DRF的权限 权限是什么 大家之前都应该听过权限~那么我们权限到底是做什么用的呢~~ 大家都有博客~或者去一些论坛~一定知道管理员这个角色~ 比如我们申请博客的时候~一定要向管理员申请~也就是说管理员 ...
- python 全栈开发,Day104(DRF用户认证,结算中心,django-redis)
考试第二部分:MySQL数据库 6. MySQL中char和varchar的区别(1分) char是定长,varchar是变长. char的查询速度比varchar要快. 7. MySQL中va ...
- Django Rest Framework之用户频率/访问次数限制
内置接口代码基本结构 settings.py: REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES':['api.utils.mythrottle.UserThr ...
- DRF(5) - 频率组件、url注册器、响应器、分页器
一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...
- drf的频率认证
频率认证源码分析 APIView --->dispatch方法--->self.initial(request, *args, **kwargs)---> self.check_th ...
- DRF 权限和频率
Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...
- DRF的权限和频率
DRF的权限 权限组件源码 权限和频率以及版本认证都是在initial方法里初始化的 我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 在rest ...
- 8) drf 三大认证 认证 权限 频率
一.三大认证功能分析 1)APIView的 dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial(request, *ar ...
随机推荐
- iOS学习之应用偏好设置
如今,即便是最简单的计算机程序也会包含一个偏好设置窗口,用户可以在其中设置应用专属的选项.在MAC OS X中,Preferences...菜单通常位于应用菜单中.选择该菜单项会弹出一个窗口,用户可以 ...
- Python(常用模块)
模块 模块 本质上就是一个.py文件 内置模块(解释器层面) 第三方模块(Python lib文件) 自定义模块(当前路径) 模块调用,包的概念 在计算机程序的开发过程中,随着程序代码越写越多,在一个 ...
- java @Retention元注解
@Retention元注解 有三种取值:RetentionPolicy.SOURCE.RetentionPolicy.CLASS.RetentionPolicy.RUNTIME分别对应:Java源文件 ...
- CWinApp类CMultiDocTemplate类CDocument类CView类的关系
转自:http://blog.csdn.net/bboot/article/details/26884011 不得不转,瞬间搞清了很多问题,短小精悍 1.CWinApp类 它包含并管理着应用程序的 ...
- MySQL引擎及选择
一.MySQL的存储引擎 完整的引擎说明还是看官方文档:http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html 这里介绍一些主要的引擎 ...
- systemverilog中module与program的区别
我们知道,verilog语法标准中是没有program的,program是systemverilog语法标准新增的内容. 那么,为什么要新增一个program呢?主要考量是基于电路的竞争与冒险. 为避 ...
- VRChat简易教程2-创建一个最基本的世界(world)
一.准备工作 1 先确保你安装了unity并导入了sdk 教程:https://www.cnblogs.com/cation/p/10311702.html 2 按之前的教程新建一个project并导 ...
- ubuntu16.04的anacoda内置的spyder不支持中文【学习笔记】
执行下面的语句:将libfcitxplatforminputcontextplugin.so复制到anaconda2的安装目录下的platforminputcontexts目录重启生效 cp /usr ...
- 获取微信公众号用户的基本信息(UnionID机制)
获取用户基本信息(UnionID机制) 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的open ...
- EF Code-First 学习之旅 级联删除
级联删除是当删除主记录的时候会自动删除依赖的记录或者设置外键属性为null public class Student { public Student() { } public int Student ...