DRF-流量控制-配置: 实现可以使用1/5m等限制规则,drf配置流量控制,drf重写流量控制类

一、base/throttle.py

在drf原生的流量控制中,只能支持1/m,1/s,1/h,1/d 等控制规则,不能实现1/5m,1/10s 等更加精细的控制。要是5分钟访问一次或多次,只能是通过12/h 这种来控制,不太友好。

重写SimpleRateThrottle 类的parse_rate方法,来满足开发的实际需求:

from rest_framework.throttling import SimpleRateThrottle#重写了限制频率的方法,原始只能支持1/s,m,h,d , 不能支持5分钟一次,10秒中一次
class NewSimpleRateThrottle(SimpleRateThrottle):def parse_rate(self, rate):"""这个方法,就是将2/10m 提取出2 和 10m计算出用户需要等待多少秒,才能再次访问的"""if rate is None:return (None, None)num, period = rate.split('/') # 2/10m  10分钟两次请求dic = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}#1、计算需要等待的总秒数if len(period)>1:#这里,支持了1/5m,1/10s 等频率规则key = period[-1] #必须是s,m,h,dif key not in ('s','m','h','d'):raise Exception(f'流量控制设置的rate有问题,不能是{rate},格式:1/10m')try:period_num = int(period.split(key)[0])except Exception:raise Exception(f'流量控制设置的rate有问题,不能是{rate},格式: 2/10m')#求出需要的等待的总时长,展示到前端时,还需要除以int(num)duration = dic[key]*period_numelif len(period) == 1:if period not in ('s','m','h','d'):raise Exception(f'流量控制设置的rate有问题,不能是{rate},格式:3/10m')#这里是对1/s,2/m,等的支持duration = dic[period]else:#排除掉 1/ 2/ 等错误的频率规则raise Exception(f'流量控制设置的rate有问题,不能是{rate},格式:4/m')#2、除以整个数值,就是真实等待秒数try:num_requests = int(num)except Exception:raise Exception(f'流量控制设置的rate有问题,不能是{rate},格式: 5/m')return (num_requests, duration)#对请求源的IP进行限制
class IPThrottle(NewSimpleRateThrottle):# 在settings中配置频率时使用到的关键字,有scope来指定scope = 'IP'def get_cache_key(self, request, view):# 这里return什么,就以什么作为限制,上面的scope本来就是用于这里去配置文件中获取rate的return request.META.get('REMOTE_ADDR')+self.scope# 可以在这里设置访问频率def get_rate(self):return '10/m'#对请求的用户进行限制
class UserThrottle(NewSimpleRateThrottle):scope = 'UserID'def get_cache_key(self, request, view):# 这里return什么,就以什么作为限制,上面的scope本来就是用于这里去配置文件中获取rate的user_pk = request.user.pkreturn user_pk+self.scope# 可以在这里设置访问频率,就无需到settings.py中设置了def get_rate(self):return '30/m'#用户请求发送验证码的接口进行限制
class PhoneNumberThrottle(NewSimpleRateThrottle):#唯一标识的一部分scope = 'phoneNumber'#以什么作为唯一标识def get_cache_key(self, request, view):# 这里return什么,就以什么作为限制,上面的scope本来是用于这里去配置文件中获取rate的phone = request.data.get('phone')return phone+self.scopedef get_rate(self):#设置1分钟一次return '1/5m'

二、在setting.py配置文件中配置全局

REST_FRAMEWORK = {#匿名用户:设置纯净版时,要设置好匿名用户'UNAUTHENTICATED_USER':None,#4、全局的使用的频率限制'DEFAULT_THROTTLE_CLASSES': ('base.throttle.IPThrottle', #使用的频率了),#4.1、对于scope=IP的限制'DEFAULT_THROTTLE_RATES': {'IP': '60/m'  # 一个ip一分钟只能访问60次 ,原始的get_rate 就是通过scope在这里获取到60/m,在设置时},}

在业务场景中,如短信服务,一般都是3分钟或5分钟或10分钟只能访问一次,可以有效的防止短信可使用条数被消耗掉。所以重写parse_rate 方法是很有必要,可以根据业务场景随意的设置控制的规则。

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

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

相关文章

开源高星精选,10个2023企业级Python测试项目,再不学习今年没了

纸上得来终觉浅,光学习理论知识是不够的。 想要学好软件测试必须要结合实战项目深入掌握,今天给大家分享十个2023最新企业级Python软件测试项目: ▌Rank 1:Requests-HTML v0.9(7385 stars on Github,来自K…

Python-基于fastapi实现SSE流式返回(类似GPT)

最近在做大模型对话相关功能,需要将对话内容流式返回给前端页面(类似GPT的效果)。下面直接说下如何实现: 1.首先导入fastapi和sse流式返回所需要的包 from fastapi import APIRouter, Response, status from sse_starlette.sse …

Vue2+Vue3组件间通信方式汇总(1)------props

目录 一、props (父传子&#xff0c;子传父) ------Vue2 ------Vue3 从Vue2(组合式API)和Vue3&#xff08;选择式API&#xff09;两个版本对每个组件间通信方式进行讲解&#xff1a; 一、props (父传子&#xff0c;子传父) ------Vue2 父组件&#xff1a; <template>&…

以太网的数据速率、互连介质和物理层规范

以太网协议连接已经广泛应用于我们周围的大量事物或设备中。过去&#xff0c;以太网用在局域网 (LAN) 和城域网 (MAN) 中&#xff0c;而如今&#xff0c;由于以太网的普及和多种优势&#xff0c;例如巨大的生态体系和日益增长的规模经济&#xff0c;它越来越多地用在存储和汽车…

鉴赏 tcp vegas

优秀的 vegas 之后&#xff0c;再鉴赏一下迄今唯一像那么回事的拥塞控制算法 vegas。 从下图可看出所有的(对&#xff0c;所有的) aimd 都毫无伸缩性(z:吞吐&#xff0c;x:rtt&#xff0c;y:丢包率&#xff0c;由 buffer_size 直接决定)&#xff1a; 一下就可看出 rtt 和 bu…

JavaSE 内部类

目录 1 实例内部类2 静态内部类3 匿名内部类4 本地内部类 1 实例内部类 内部类&#xff1a; 外部类有一个…或外部类是由什么什么组成的。 实例内部类: 定义在类的内部的一个类。 如何实例化内部类对象&#xff1f; OuterClass.InnerClass innerClass2 out.new InnerClass()…

(四)pytorch图像识别实战之用resnet18实现花朵分类(代码+详细注解)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、关于这个实战的一些知识点Q1&#xff1a;图像识别实战常用模块解读Q2:数据增强Q3:迁移学习Q4&#xff1a;平均全局池化Q5&#xff1a;设置哪些层需要训练时…

大一C语言查缺补漏1 12.2

学习方向非C语言方向&#xff0c;但是专业是。。 仅供参考&#xff0c;&#xff0c;祝大家期末考试顺利。 对于二维数组定义&#xff0c;要给出明确的定义 eg&#xff1a;double a [21][4] int a [ ][3] {1,2,3,4,5,6} 不可以是&#xff1a;int a [ ][3]&#xff1b; 在c…

Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

前言 在开发UI滚动列表的时候&#xff0c;经常会有每项的背景图不统一的情况&#xff0c;会间隔重复的情况居多。这种情况下&#xff0c;手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下&#xff0c;笔者尝试写个小工具&#xff0c;在搭建UI时配置一下循环背景的…

《数据结构、算法与应用C++语言描述》- 最小赢者树模板的C++实现

赢者树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_30winnerTree 比赛规则 假定有 n 个选手参加一次网球比赛。比赛规则是“突然死亡法”(sudden-death mode)&#xff1a;一名选手只要输掉一场球&#xff0c;就被淘汰。一对一对…

fill-in-the-middle(FIM) 实现与简单应用

1 背景 传统训练的 GPT 模型只能根据前文内容预测后文内容&#xff0c;但有些应用比如代码生成器&#xff0c;需要我们给出上文和下文&#xff0c;使模型可以预测中间的内容&#xff0c;传统训练的 GPT 就不能完成这类任务。 传统训练的 GPT 只能根据上文预测下文 使用 FIM…

vue-element安装富文本编辑器vue-quill-editor教程

在vue ui面板中安装vue-quill-editor依赖 命令安装 npm install vue-quill-editor --save # or yarn add vue-quill-editor 使用方法 在main.js导入富文本编辑器 import VueQuillEditor from vue-quill-editor import quill/dist/quill.core.css // import styles import…

技术博客:市面上加密混淆软件的比较和推荐

技术博客&#xff1a;市面上加密混淆软件的比较和推荐 引言 市面上有许多加密混淆软件可供开发者使用&#xff0c;但哪些软件是最好用的&#xff1f;哪些软件受到开发者的喜爱&#xff1f;本文将根据一次在CSDN上的投票结果&#xff0c;为大家介绍几款在程序员中普及度较高的…

CEC2013(python):五种算法(ABC、PSO、CSO、OOA、DBO)求解CEC2013(python代码)

一、五种算法简介 1、人工蜂群算法 &#xff08;Artificial Bee Colony Algorithm, ABC&#xff09; 2、粒子群优化算法PSO 3、鸡群优化算法CSO 4、鱼鹰优化算法OOA 5、蜣螂优化算法DBO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff…

机器学习 项目结构 数据预测 实验报告

需求&#xff1a; 我经过处理得到了测试值&#xff0c;然后进一步得到预测和真实值的比较&#xff0c;然后再把之前的所有相关的参数、评估指标、预测值、比较结果都存入excel,另外我还打算做测试报告模板&#xff0c;包括敏感性分析等。您建议我这些功能如何封装这些功能&…

源码部署MySQL

MySQL 1.准备环境 关闭防火墙 [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#systemctl disable firewalld 关闭selinux [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#sed -i %s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config 验证是否通网 …

WINDOWS(WIN11)通过IP添加网络打印机

点击添加设备 点击手动添加 使用IP地址或主机名添加打印机 选择TCP/IP设备&#xff0c;输入打印机地址 如果有正确驱动就安装&#xff0c;没有就取消。 通过手动设置添加本地打印机或网络打印机 使用现有的端口 根据打印机IP&#xff0c;选择标准端口。 成功&#xff01; 到…

警惕Kann勒索病毒的最新变种.kann,您需要知道的预防和恢复方法。

导言&#xff1a; 勒索病毒已经成为网络安全的一大威胁&#xff0c;其中之一就是.kann勒索病毒。本文将深入介绍.kann勒索病毒&#xff0c;包括其攻击方式、数据加密机制&#xff0c;以及如何有效恢复被加密的数据文件&#xff0c;并提供一系列预防措施以保护系统免受.kann勒索…

element ui el-avatar 源码解析零基础逐行解析

avatar功能介绍 快捷配置头像的样式 avatar 的参数配置 属性说明参数size尺寸type string 类型 &#xff08;‘large’,‘medium’,‘small’&#xff09;number类型 validator 校验shape形状circle (原型) square&#xff08;方形&#xff09;icon传入的iconsrc传入的图片st…

阿里lindorm与MyBatis Plus集成

lindorm与MyBatis Plus集成 1 添加依赖&#xff1a; 在项目的pom.xml文件中添加lindorm和MyBatis Plus的依赖。 <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>lindorm-jdbc</artifactId><version>1.1.1…