Rest_Framework之频率组件部分

一、RestFramework之频率组件源码部分

频率组件的源码部分和权限组件流程一模一样的,这里就不多说了,直接上源码的主要逻辑部分:

def check_throttles(self, request):"""Check if request should be throttled.Raises an appropriate exception if the request is throttled."""for throttle in self.get_throttles():if not throttle.allow_request(request, self):self.throttled(request, throttle.wait())

明确表示我们写的频率类需要一个allow_request()方法:

频率类(完成一分钟同一个ip只能访问三次):

import time
from rest_framework.throttling import BaseThrottleclass MyThrottle(BaseThrottle):visited_record = {}def __init__(self):self.history = Nonedef allow_request(self, request, my_cbv):# 这个my_cbv是源码中传的我们的视图类,这里我们也要传进去# print(self.get_ident(request))  # 可以获取本次请求的ipip = request.META.get("REMOTE_ADDR")if ip not in self.visited_record:self.visited_record[ip] = []current_time = time.time()history = self.visited_record[ip]self.history = historywhile history and current_time - history[-1] > 60:  # 把与当前访问时间相差大于60秒的时间都删掉
            history.pop()if len(history) > 2:  # 第三次访问,列表中只有2个值,也满足条件,大于2个值时不满足条件return Falsehistory.insert(0, current_time)return Truedef wait(self):"""用于返回还剩多少时间访问;本次访问时间:9:50:55[09:50:30, 09:50:20, 09:50:10]   剩余 60 - (9:50:55 - 09:50:10)秒才能访问:return:"""c_time = time.time()return 60 - (c_time - self.history[-1])  

视图类:

class BookView(ModelViewSet):authentication_classes = [UserAuth]      #认证类permission_classes = [UserPerm]        #权限类throttle_classes = [MyThrottle]      #频率类queryset = Book.objects.all()serializer_class = BookSerializer

效果如下:

可以在全局settings配置

REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ('rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser'),'DEFAULT_AUTHENTICATION_CLASSES': 'app01.utils.auth_class.UserAuth',),'DEFAULT_PERMISSION_CLASSES': ('app01.utils.permission_class.VipPermission',),'DEFAULT_THROTTLE_CLASSES': ('app01.utils.throttle_class.MyThrottle',),
}

 二、使用restframework组件中的提供的访问限制

实现方式和我们上面的方式基本相同;

基于限制ip的类:SimpleRateThrottle   

基于ip的访问限制:

频率类——局部:

from rest_framework.throttling import SimpleRateThrottleclass MyThrottle(SimpleRateThrottle):rate = '5/m'def get_cache_key(self, request, view):  # 这个方法也是必须要有return self.get_ident(request)

 

在视图类中指定频率类

class BookView(ModelViewSet):throttle_classes = [app_throttles.RateThrottle]queryset = Book.objects.all()serializer_class = BookSerializer

 

 duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}

频率类——全局:

from rest_framework.throttling import SimpleRateThrottleclass MyThrottle(SimpleRateThrottle):scope = "visit_rate"  # 这个值决定了在配置时使用哪个变量描述限制的频率,必须在settings里面配置def get_cache_key(self, request, view):  # 这个方法也是必须要有return self.get_ident(request)

这次只能在setttings中配置:

REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ('app01.utils.throttle_class.MyThrottle',),"DEFAULT_THROTTLE_RATES": {"visit_rate": "10/m",   # 这个参数就是频率类中定义的那个参数scope, 其中第一个数字10表示10次,后面的m表示一分钟,还有s,一秒, h, 一小时, d, 一天
    }
}
 duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}

转载于:https://www.cnblogs.com/fengchong/p/10100488.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS服务器下对mysql的优化

一、mysql的优化思路 mysql的优化分为两方面: 1. 服务器使用前的优化 2. 服务使用中的优化 二、mysql的基础优化步骤 1. 硬件级优化 (1). 最好mysql自己使用一台物理服务器 (2). 内存和CPU方面,根据需求给予…

【使用指南】WijmoJS 前端开发工具包

为方便广大前端开发人员更好的使用 WijmoJS 前端开发工具包,葡萄城专门推出了 WijmoJS 使用指南,该指南详细地介绍了如何把 WijmoJS 各种强大的功能应用到您自己的 Web 项目中,助您轻松掌握产品使用技巧,快速完成产品选型。 本指南…

phpMyAdmin4.4.10安装

1.下载地址: phpMyAdmin4.4.10 https://files.phpmyadmin.net/phpMyAdmin/4.4.10/phpMyAdmin-4.4.10-all-languages.zip Apache 2.4.12(VC9) http://www.apachehaus.com/cgi-bin/download.plx php-5.4.42(VC9&#xff09…

汇编实验九

20171308171 胡欣怡 一、实验目的1. 掌握十进制两位数输出的方法2. 理解 8025 彩色字符模式显示原理3. 综合应用寻址方式和汇编指令完成应用编程二、实验准备1. 复习数值和数字字符之间的转换方法,div 指令用法2. 学习 P187-189 支撑材料及「实验 9 提示」&#xff…

Tensorflow取消占用全部GPU

参考:https://www.cnblogs.com/jiu0821/p/9501665.html Tensorflow默认是会占用全部的GPU,而有时候你根本不需要那么占用那么多GPU资源,这时候就可以采用如下三种方法进行解决: 1、在构造tf.Session()时候通过传递tf.GPUOptions作…

mysql5.7.12安装问题

mysql5.7.6之后不再有data数据目录,需手动初始化数据目录。 在Windows上,使用这些命令之一: C:\> bin\mysqld --initialize C:\> bin\mysqld --initialize-insecure 使用 --initialize为 “缺省安全”安装(会生成一个随机的初始 root密码)。不过密码会被标记为…

P5068 [Ynoi2015]我回来了

传送门 解锁成就:ynoi的题目都做到过原题 因为\(n\)很小,我们可以用\(sss[u][i]\)表示到点\(u\)的距离不超过\(i\)的点的集合,这个可以用bitset存,然后先一遍bfs,再做一个前缀和就可以处理好了 询问的话,把…

U盘安装centos 7 提示 “Warning: /dev/root does not exist, could not boot” 解决办法

安装centos 7时提示 “Warning: /dev/root does not exist, could not boot” 这个问题是没有找到你的U盘,这个配置是需要在上一步需要完成的,但在上一步我们并不知道U盘的文件名,所以索性在这一步查看一下U盘的设备名,然后再回到…

bzoj 3585 mex

Written with StackEdit. 题目描述 有一个长度为\(n\)的数组\({a_1,a_2,...,a_n}\)。\(m\)次询问,每次询问一个区间内最小没有出现过的自然数。 Input 第一行\(n,m\)。 第二行为\(n\)个数。 从第三行开始,每行一个询问\(l,r\)。 Output 一行一个数&#…

ffmpeg转mp4格式

FFMPEG -i uploadfile/video/test.wmv -c:v libx264 -strict -2 uploadfile/mp4/test.mp4FFMPEG -i uploadfile/video/test.wmv -c:v libx264 -strict -2 -s 1280x720 -b 1000k uploadfile/mp4/test.mp4

(笔记)网络技术学习交流会

1、网络工程师发展历程 (1)网络管理员阶段 ①计算机硬件的维护 ②计算机系统的维护 ③局域网的维护 ④打印服务的维护 ⑤业务数据的管理(更新、备份) ⑥网站的维护(在网站上进行更新) ⑦在网络上对公司进行…

CentOS 6服务器简单安全配置

1. 禁用不使用的用户 注意:不建议直接删除,当你需要某个用户时,自己重新添加会很麻烦。也可以usermod -L或passwd -l user锁定。 cp /etc/passwd{,.bak}修改之前先备份 vi /etc/passwd编辑用户,在前面加上#注释掉此行 注释的用…

【原创】大叔经验分享(6)Oozie如何查看提交到Yarn上的任务日志

通过oozie job id可以查看流程详细信息,命令如下: oozie job -info 0012077-180830142722522-oozie-hado-W 流程详细信息如下: Job ID : 0012077-180830142722522-oozie-hado-W -----------------------------------------------------------…

Beta 冲刺(3/7)

Beta 冲刺(3/7) Beta 冲刺 (3/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 参与开发关键词提醒部分展示G…

vuex的理解

首先需要了解vuex的基本概念和使用方式,vue的官网也有很详细的说明或者浏览:https://zhuanlan.zhihu.com/p/24357762。vue是单页应用所以当页面刷新时vuex的数据随之也被清空了,如何实现页面被刷新而数据没有被清空呢?vuex主要是v…

Redis高可用sentinel

1.sentine介绍 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行…

关于eclipse web项目认不到用户库的问题

解决方法: 选中项目右键属性,弹出对话框,选择Deployment Assembly,设置用户库对应路径。

Python中 类和对象调用其他类中的变量和方法

class house_item: def __init__(self,name,area): self.namename self.areaarea def __str__(self): return "%s,\n面积是%.2f" % (self.name,self.area)class house: def __init__(self,house_type,house_area): self.typeho…

201771010109焦旭超《面向对象程序设计(java)》第十六周学习总结

1、实验目的与要求 (1) 掌握线程概念; (2) 掌握线程创建的两种技术; (3) 理解和掌握线程的优先级属性及调度方法; (4) 掌握线程同步的概念及实现技术; 2、实验内容和步骤 实验1:测试程序并进行代码注释。 测试程序1&am…

Hibernate hql getHibernateTemplate()常用方法汇总

getHibernateTemplate()常用方法 一、find(String queryString); 示例: Java代码 this.getHibernateTemplate().find("from bean.User"); 返回所有User对象 二、find(String queryString , Object value); 示例: Java代码 this.getHib…