基于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 ...
随机推荐
- vscode源码分析【二】程序的启动逻辑,第一个窗口是如何创建的
上一篇文章:https://www.cnblogs.com/liulun/ (小广告:我做的开源免费的,个人知识管理及自媒体营销工具“想学吗”:https://github.com/xland/xia ...
- Python连载45-XML解析(使用minidom和etree分别示例)
一.我们对XML的读取进行一波演示 import xml.dom.minidom #负责解析xml文件的包 from xml.dom.minidom import parse #使用minidom ...
- iOS: 本地通知的前后变化(iOS10)
一.介绍 通知和推送是应用程序中很重要的组成部分.本地通知可以为应用程序注册一些定时任务,例如闹钟.定时提醒等.远程推送则更强大,提供了一种通过服务端主动推送消息到客户端的方式,服务端可以更加灵活地 ...
- 【zabbix告警配置】zabbix服务配置邮件告警
一.安装邮件服务 在zabbix_server服务端安装邮件和邮件发送服务,这里可以参考我另一篇邮件服务部署文章:https://www.cnblogs.com/HeiDi-BoKe/p/118833 ...
- 【mysql】You must reset your password using ALTER USER statement before executing this statement. 报错处理
1.问题:登陆mysql以后,不管运行任何命令,总是提示这个 mysql> select user,authentication from mysql.user; ERROR 1820 (HY0 ...
- oracle 关联更新
不多说了,我们来做实验吧. 创建如下表数据 select * from t1 ; select * from t2; 现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致. 方式1,u ...
- 解决No 'Access-Control-Allow-Origin' header is present on the requested resource.跨域问题
跨域错误 错误原因 解决方法在后台写一个过滤器过滤器来改写请求头头 CorsFilter.java public class CorsFilter implements Filter { @Overr ...
- [笔记] .net core WPF 程序,发布独立程序与单一执行程序
如何发布独立可运行的,和只有一个文件的 .net core WPF 程序. 1 发布并打包 Step 1 在项目上右键,在菜单中选择发布,使用文件发布,选择独立部署模式,其它的条件,依照自己的情况设置 ...
- react聊天室|react+redux仿微信聊天IM实例|react仿微信界面
一.项目概况 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+react-photoswipe+swiper等技术混合开 ...
- Linux(ubuntu) 三行代码搞定安装谷歌浏览器
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 然后再输入: sudo dpkg -i g ...