drf频率组件
1.简介
控制访问频率的组件
2.使用
手写一个自定义频率组件
import time
#频率限制
#自定义频率组件,return True则可以访问,return False则不能访问
class MyThrottle():
visitor_dic={}
def __init__(self):
self.history=None
def allow_request(self,request,view):
'''
{'ip1':[时间1,时间2],
'ip2':[时间1,],
}
'''
# 基本原理
#1.取出访问者ip
#2.判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
#3.循环判断当前ip的列表,有值,并且当前时间减去最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
#4.判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
#5.当大于等于3,说明一分钟内访问超过三次,返回False验证失败
#META:请求所有的东西的字典
ip=request.META.get('REMOTE')
print(ip)
#不在字典中,说明是第一次访问
ctime=time.time()
if ip not in self. visitor_dic:
self.visitor_dic[ip]=[ctime,]
return True
#根据当前访问者ip,取出访问的时间列表
history=self.visitor_dic[ip]
self.history=history
while history and ctime -history[-1]>60:
#pop默认是删除最后一项的
history.pop()
if len(history)<3:
#把当前时间放到第0个位置上,
history.insert(0,ctime)
return True
return False
#设定了访问频率,则要设定wait函数,返回的是剩余时间
def wait(self):
ctime=time.time()
return 60-(ctime-self.history[-1])
真正写一个频率组件
在settings里写配置
REST_FRAMEWORK={
'DEFAULT_THROTTLE_CLASS':['app01.MyAuth.MyThrottle',],
'DEFAULT_THROTTLE_RATES':{'aaa':'3/m'}
}
在MyAuth进行定义
from rest_framework.throttling import SimpleRateThrottle
class MyThrottle(SimpleRateThrottle):
#scope要与settings里进行对应,可以找到限制的频率
scope='aaa'
def get_cache_key(self, request, view):
#内部做了啥事
#返回ip地址
#ip=request.META.get('REMOTE_ADDR')
#return ip
#这里返回的是ip,如果想限制域名,则下面返回的则需要是域名
return self.get_ident(request)
可以在views里进行重写错误信息
class Authors(APIView):
throttle_classes = [MyAuth.MyThrottle, ]
# authentication_classes = [MyAuth.LoginAuth,]
# permission_classes = [MyAuth.UserPermission,]
def get(self, request):
response = {'status': 100, 'msg': '查询成功'}
ret = models.Author.objects.all()
author_ser = MySer.AuthorSerializer(ret, many=True)
response['data'] = author_ser.data
return JsonResponse(response, safe=False)
# 重写错误显示信息
def throttled(self, request, wait):
class MyThrottled(exceptions.Throttled):
default_detail = '煞笔'
extra_detail_singular = '还剩{wait}秒'
extra_detail_plural = '还剩{wait}秒'
raise MyThrottled(wait)
全局使用,在settings里进行设置
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': ['app01.MyAuth.MyThrottle', ],
'DEFAULT_THROTTLE_RATES': {
'aaa': '10/m'
}
}
drf频率组件的更多相关文章
- drf 频率组件 META字典详情
drf频率组件 什么是频率 控制用户对某个url的请求频率,比如一分钟之内,只能访问三次 自定义频率规则 1.取出访问者ip 2.判断当前ip在不在访问字典中: 不在,则添加进去,返回True; 3. ...
- DRF框架(七) ——三大认证组件之频率组件、jwt认证
drf频率组件源码 1.APIView的dispatch方法的 self.initial(request,*args,**kwargs) 点进去 2.self.check_throttles(re ...
- 【DRF频率】
目录 使用自带的频率限制类 使用自定义的频率限制类 开发平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. DRF就为我们提供了一些频率限制的方法. DRF中的版本.认证.权限 ...
- DRF(5) - 频率组件、url注册器、响应器、分页器
一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...
- DRF之权限认证频率组件
概要 retrieve方法源码剖析 认证组件的使用方式及源码剖析 权限组件的使用方式及源码剖析 频率组件的使用方式及源码剖析 知识点复习回顾 Python逻辑运算 知识点复习回顾一:Python逻辑运 ...
- Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)
一.认证组件 使用方法: ①写一个认证类,新建文件:my_examine.py # 导入需要继承的基类BaseAuthentication from rest_framework.authentica ...
- drf框架 - 三大认证组件 | 认证组件 | 权限组件 | 频率组件
RBAC 基于用户权限访问控制的认证 - Role-Based Access Control Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则.五表规则,Django采用 ...
- drf token刷新配置、认证组件(使用)、权限组件(使用)、频率组件(使用)、异常组件(使用)
目录 一.特殊路由映射的请求 二.token刷新机制配置(了解) 三.认证组件项目使用:多方式登录 1.urls.py 路由 2.views.py 视图 3.serializers.py 序列化 4. ...
- drf三大组件之频率认证组件
复习 """ 1.认证组件:校验认证字符串,得到request.user 没有认证字符串,直接放回None,游客 有认证字符串,但认证失败抛异常,非法用户 有认证字符串, ...
随机推荐
- ThreadLocal 那点事儿(续集)
本篇是<ThreadLocal 那点事儿>的续集,如果您没看上一篇,就就有点亏了.如果您错过了这一篇,那亏得就更大了. 还是保持我一贯的 Style,用一个 Demo 来说话吧.用户提出一 ...
- 夺冠概率|2012年蓝桥杯B组题解析第九题-fishers
(17')夺冠概率 足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能. 假设有甲.乙.丙.丁四个球队.根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表: 甲 乙 丙 丁 甲 - 0. ...
- Sqlite数据库管理(SQLite Developer) v4.0.0.528 中文版+破解方法(申明:来源于网络)
Sqlite数据库管理(SQLite Developer) v4.0.0.528 中文破解版 SharpPlus Sqlite Developer 特性: -强大的SQL编辑器 *Sqlite Sql ...
- mysql distinct 后面没有括号
当distinct应用到多个字段的时候,其应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段,而且distinct只能放到所有字段的前面 如下语句是错误的: SELECT country, di ...
- db2 查杀死锁进程
db2 查杀死锁进命令 db2 get snapshot for locks on (需要snapshot的访问权限) db2 list applications db2 "force ap ...
- hdu4847 Wow!Such Doge!【字符串】【暴力】
Wow! Such Doge! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- [No000014A]Linux简介与shell编程
Linux 介绍 内核 库: .so 共享对象,windows:dll 动态链接库 应用程序 Linux的基本原则: 1.由目的单一的小程序组成:组合小程序完成复杂任务: 2.一切皆文件: 3.尽量避 ...
- [No0000126]SSL/TLS原理详解与WCF中的WS-Security
SSL/TLS作为一种互联网安全加密技术 1. SSL/TLS概览 1.1 整体结构 SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下: SSL:(Secure Socket La ...
- 在ubuntu系统中,python依赖存放的路径
你在使用python,之后你想给python安装一些第三方库,如tensorflow或者tensorrt,那么这些包存放在哪个路径下呢? 该目录下: /usr/local/lib/python3.5/ ...
- Vue SSR 配合Java的Javascript引擎j2v8实现服务端渲染2创建Vue2+webpack4项目
前提 安装好nodejs并配置好环境变量,最好是 node10,https://nodejs.org/en/download/ 参考我之前的文章 debian安装nodejs Yarn &&a ...