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框架的频率组件的更多相关文章

  1. 基于Django的Rest Framework框架的认证组件

    0|1一.认证组件的作用 在一个程序中有一些功能是需要登录才能使用的,原生Django中的auth组件可以用来解决这个认证问题,drf框架中也有对应的认证组件来解决这个问题. models.py   ...

  2. 基于Django的Rest Framework框架的序列化组件

    本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ...

  3. 基于Django的Rest Framework框架的视图组件

    本文目录 一 基本视图 二 mixin类和generice类编写视图 三 使用generics 下ListCreateAPIView,RetrieveUpdateDestroyAPIView 四 使用 ...

  4. 基于Django的Rest Framework框架的分页组件

    本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...

  5. 基于Django的Rest Framework框架的版本控制

    本文目录 一 作用 二 内置的版本控制类 三 局部使用 四 全局使用 五 示例 源码分析 回到目录 一 作用 用于版本的控制 回到目录 二 内置的版本控制类 from rest_framework.v ...

  6. 基于Django的Rest Framework框架的RESTful规范研究

    一.什么是RESTful规范 总的来说:RESTful规范就是一个非技术,人为约定的一个面向资源的架构理念. REST与技术无关,代表的是一种软件架构风格,REST是Representational ...

  7. 基于Django的Rest Framework框架的解析器

    本文目录 一 解析器的作用 二 全局使用解析器 三 局部使用解析器 四 源码分析 回到目录 一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有appli ...

  8. 基于Django的Rest Framework框架的url控制器

    本文目录 一 自定义路由(原始方式) 二 半自动路由(视图类继承ModelViewSet) 三 全自动路由(自动生成路由) 回到目录 一 自定义路由(原始方式) from django.conf.ur ...

  9. 基于Django的Rest Framework框架的响应器

    本文目录 一 作用 二 内置渲染器 三 局部使用 四 全局使用 五 自定义显示模版 回到目录 一 作用 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件.用户请求URL:    ht ...

随机推荐

  1. 基于Django的Rest Framework框架的视图组件

    本文目录 一 基本视图 二 mixin类和generice类编写视图 三 使用generics 下ListCreateAPIView,RetrieveUpdateDestroyAPIView 四 使用 ...

  2. 立足于运维与监控的前端框架 NoahV

    NoahV是一个致力于解决中后台前端效率问题的前端框架,立足于运维和监控的应用场景,使用当前前端最新的技术栈并结合团队在项目开发中的最佳实践从而推出的前端开发框架. NoahV提供的功能覆盖了从开发到 ...

  3. linux下通过命令行把文件拷贝到U盘上

    常用linux,往U盘拷贝文件是常用的一种方法.下面这个方法是笔者亲测有效,暂时记录下来. 1.插入U盘,fdisk -l查看U盘是哪个设备(比如/dev/sdb1)然后mount  /dev/sdb ...

  4. Leetcode练习题 Palindrome Number

    9. Palindrome Number Question: Determine whether an integer is a palindrome. An integer is a palindr ...

  5. .deb文件安装应该怎么做

    https://unix.stackexchange.com/questions/159094/how-to-install-a-deb-file-by-dpkg-i-or-by-apt

  6. Java的23种设计模式,详细讲解(二)

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  7. Windows下 gcc/g++的安装与配置

    引言 我们知道开发最好用Mac/Linux,效率很高,但是对于很多还是Windows用户的我们来说,编写代码再到linux上运行也是很常有的事情,但对于我们写一些小demo使用上面的流程难免有点兴师动 ...

  8. 自定义Vue组件打包、发布到npm以及使用

    本文将帮助:将自己写的Vue组件打包到npm进行代码托管,以及正常发布之后如何使用自己的组件. 本文讲述的仅仅是最基础的实现,其他复杂的操作需要非常熟悉webpack的相关知识,作者将继续学习. 先附 ...

  9. Apache2 在Linux环境下的安装

    安装Apache2: apt-get install apache2 启动Apache2服务: service apache2 start 在终端运行启动后,打开浏览器URL访问 http://loc ...

  10. MySQL 部署分布式架构 MyCAT (五)

    分片(水平拆分) 4.全局表 业务使用场景: 如果你的业务中有些数据类似于数据字典,比如配置文件的配置, 常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大, 而且大部分的业务场景都会用到 ...