基于Django的Rest Framework框架的频率组件
0|1一、频率组件的作用
在我们平常浏览网站的时候会发现,一个功能你点击很多次后,系统会让你休息会在点击,这其实就是频率控制,主要作用是限制你在一定时间内提交请求的次数,减少服务器的压力。
modles.py
0|1二、自定义频率组件类
#(1)取出访问者ip
# (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
# (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
# (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
# (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败
自定义频率组件的逻辑
- myauth.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.permissions import BasePermission
from app01.models import TokenUser
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.throttling import BaseThrottle class MyAuthentication(BaseAuthentication):
#验证过程
def authenticate(self, request):
token = request.GET.get('token')
token_user = TokenUser.objects.filter(token=token).first()
if token_user:
return token_user.user,token
else:
raise AuthenticationFailed('你还未登录,请先登录') class MyPermission(BasePermission):
message = '该用户的权限无法使用该功能'
def has_permission(self, request, view):
type = int(request.user.type)
if type == 2 or type ==3:
return True
else:
return False import time
class MyThrottle():
# (1)取出访问者ip
# (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
# (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
# (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
# (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败
visit_dic = {} # 访问的ip时间字典
def __init__(self):
self.history = None #某个ip的时间列表
def allow_request(self, request, view):
ip = request.META.get('REMOTE_ADDR') #获取请求中的ip地址
now_time = time.time()
print(self.visit_dic)
if ip not in self.visit_dic:
self.visit_dic[ip] = [now_time,] #ip第一次来时,添加ip和时间至ip时间字典
return True
self.history = self.visit_dic.get(ip,None)
while self.history and (now_time-self.history[-1]>60):
self.history.pop()
if len(self.history)<3:
self.history.insert(0,now_time)
return True
else:
return False
def wait(self):
pass
- views.py
from django.shortcuts import render
from rest_framework.response import Response # Create your views here.
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
from app01 import models
from app01.myserializer import BookSerializer
from rest_framework.views import APIView
from app01.myAuth import MyAuthentication,MyPermission,MyThrottle class BooksView(ListCreateAPIView):
authentication_classes = [MyAuthentication] #加上验证的类,如果有多个,会从做到右依次验证
permission_classes = [MyPermission]
throttle_classes = [MyThrottle]
queryset = models.Book.objects.all()
serializer_class = BookSerializer class BookView(RetrieveUpdateDestroyAPIView):
authentication_classes = [MyAuthentication]
queryset = models.Book.objects.all()
serializer_class = BookSerializer import uuid
#登录
class Login(APIView):
def post(self,request):
name = request.data.get('name')
pwd = request.data.get('pwd')
user = models.User.objects.filter(name=name,pwd=pwd).first()
if user:
token = uuid.uuid4()
models.TokenUser.objects.update_or_create(user=user,defaults={"token":token})
response = {"status":100,"message":"登录成功"}
else:
response = {"status": 200, "message": "登录失败"}
return Response(response)
其余与权限认证代码一致。
结果1:

结果2:

0|1三、继承SimpleRateThrottle的频率组件
- myauth.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.permissions import BasePermission
from app01.models import TokenUser
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.throttling import BaseThrottle,SimpleRateThrottle class MyAuthentication(BaseAuthentication):
#验证过程
def authenticate(self, request):
token = request.GET.get('token')
token_user = TokenUser.objects.filter(token=token).first()
if token_user:
return token_user.user,token
else:
raise AuthenticationFailed('你还未登录,请先登录') class MyPermission(BasePermission):
message = '该用户的权限无法使用该功能'
def has_permission(self, request, view):
type = int(request.user.type)
if type == 2 or type ==3:
return True
else:
return False class MyThrottle(SimpleRateThrottle):
scope = 'throttle' #settins中的配置
def get_cache_key(self, request, view):
return request.META.get('REMOTE_ADDR',None)
0|1四、频率组件的使用方式
1.局部使用:在需要使用权限验证的视图类中写上变量 throttle_classes= [ 权限类名,]
2.全局使用:在settings.py配置文件中,加入 REST_FRAMEWORK = {‘DEFAULT_THROTTLE_CLASSES’:'权限类的具体位置例如(app01.myauth.MyThrottle)'}
3.全局使用,局部禁用:在全局使用的基础上,在不需要验证权限的视图类中,将变量 throttle_classes改为 [ ] 即 throttle_classes = [ ]
0|1五、频率组件的源码分析









__EOF__
基于Django的Rest Framework框架的频率组件的更多相关文章
- 基于Django的Rest Framework框架的认证组件
0|1一.认证组件的作用 在一个程序中有一些功能是需要登录才能使用的,原生Django中的auth组件可以用来解决这个认证问题,drf框架中也有对应的认证组件来解决这个问题. models.py ...
- 基于Django的Rest Framework框架的序列化组件
本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ...
- 基于Django的Rest Framework框架的视图组件
本文目录 一 基本视图 二 mixin类和generice类编写视图 三 使用generics 下ListCreateAPIView,RetrieveUpdateDestroyAPIView 四 使用 ...
- 基于Django的Rest Framework框架的分页组件
本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...
- 基于Django的Rest Framework框架的版本控制
本文目录 一 作用 二 内置的版本控制类 三 局部使用 四 全局使用 五 示例 源码分析 回到目录 一 作用 用于版本的控制 回到目录 二 内置的版本控制类 from rest_framework.v ...
- 基于Django的Rest Framework框架的RESTful规范研究
一.什么是RESTful规范 总的来说:RESTful规范就是一个非技术,人为约定的一个面向资源的架构理念. REST与技术无关,代表的是一种软件架构风格,REST是Representational ...
- 基于Django的Rest Framework框架的解析器
本文目录 一 解析器的作用 二 全局使用解析器 三 局部使用解析器 四 源码分析 回到目录 一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有appli ...
- 基于Django的Rest Framework框架的url控制器
本文目录 一 自定义路由(原始方式) 二 半自动路由(视图类继承ModelViewSet) 三 全自动路由(自动生成路由) 回到目录 一 自定义路由(原始方式) from django.conf.ur ...
- 基于Django的Rest Framework框架的响应器
本文目录 一 作用 二 内置渲染器 三 局部使用 四 全局使用 五 自定义显示模版 回到目录 一 作用 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件.用户请求URL: ht ...
随机推荐
- Pandas入门系列(一)-- Series
Series的创建 ##数据分析汇总学习 https://blog.csdn.net/weixin_39778570/article/details/81157884 # 使用列表创建 >> ...
- Selenium+java - 关于富文本编辑器的处理
什么是富文本编辑器? 富文本编辑器,Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器.具体长啥样,如下图: 通过自动化操作富文本编辑器 模拟场景:在富文 ...
- vue 开发常见问题解决大全
vue添加favicon.ico,包含开发环境和生产环境显示. 1.把图标放在下项目的根目录.. 2.修改build文件夹下面的webpack.dev.conf.js(开发环境) 和webpack.p ...
- 【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)
[LOJ#2507][CEOI2011]Matching(KMP,树状数组) 题面 LOJ 题解 发现要做的是排名串的匹配. 然后我们考虑把它转成这个位置之前有多少个数小于当前这个数,这样子只要每个位 ...
- Maven的assembly插件在linux启动卡住Starting the localhost.localdomain
1.今天在测试assembly的时候,在Linux虚拟机,内存配置为512mb,然后开始在Linux上运行assembly的时候就会一直卡住 2.停止运行后,查看了下日志 [root@localho ...
- Spring MVC的常用注解(一)
概述 Spring从2.5版本开始引入注解,虽然版本不断变化,但是注解的特性一直被延续下来并不断进行扩展,这里就来记录一下Spring MVC中常用的注解,本文记录@Controller.@Reque ...
- TCP协议的三次握手与四次挥手
1.数据包说明 1)源端口号(16位):它(连同源主机IP地址)标识源主机的一个应用进程. 2)目标端口号(16位):它(连同源主机IP地址)标识目的主机的一个应用进程.这两个值加上IP报头中的源主机 ...
- 使用element-ui的el-menu导航选中后刷新页面保持当前选中
<el-menu :default-active=‘$route.path‘ :router=‘true‘ :unique-opened=‘true‘ :default-openeds=&quo ...
- javascript常用数据验证函数
正则表达式日期验证函数 function CheckDate(str){ //在JavaScript中,正则表达式只能使用"/"开头和结束,不能使用双引号 ...
- 字符串和id的转换方法
在项目中经常会遇到一个需求就是字符串和id的转换,比如标签和标签id.因为在存储系统里面存储字符串会比较浪费内存,而存储id会节省内存和提高效率. 问题分解 通过字符串获得id 通过id获得字符串 实 ...