(待更)DRF:限流(单视图或全局设置限流方案)

news2025/6/7 12:15:34

建议先看完本人的另两篇博客:认证(http://t.csdnimg.cn/G4idK)和权限(http://t.csdnimg.cn/0hpJf),或者了解认证和权限,有一定基础,再来看本篇博客。

基本原理

开发过程中如果某个接口不想让用户频繁访问,那么就需要限流。
对于已登陆的用户,用户信息的唯一主键作为唯一标识。对于未登陆的用户,IP作为唯一标识。
每个唯一标识都在redis中(或者Django默认缓存中)对应着其访问记录的列表。譬如IP为abcd的用户,在22:4021:10时分别访问了该接口。那么在redis中(或者Django默认缓存中)便维护着"abcd": [22:40, 21:10]的记录。

譬如现在想要限制频率为10分钟只能访问三次,那么步骤如下:

  1. 获取当前时间
  2. 当前时间-10分钟=计数开始时间
  3. 根据唯一标识获取到访问记录
  4. 在访问列表中删除小于计数开始时间的记录
  5. 计算现在访问列表
    • 长度达到3,抛出异常
    • 长度未超过3,访问该接口

限流组件(即限流器)

在tools中新建throttle.py,代码如下:

from rest_framework.throttling import SimpleRateThrottle


class MyThrottle(SimpleRateThrottle):
    # 构造缓存中的key
    scope = "user"
    # 设置访问频率
    THROTTLE_RATES = {"user": "3/m"}

    def get_cache_key(self, request, view):
        if request.user:
            # 存储在数据库里的用户id,因为id被我们设置成了主键
            identification = request.user.pk
        else:
            # 去请求里获取用户的IP地址
            identification = self.get_ident(request)
        return self.cache_format % {
            'scope': self.scope,
            'ident': identification
        }

可以发现不同于认证和权限,其组件都是继承自BaseXXX,一般自定义的限流组件都是继承自SimpleRateThrottle这种具体实现子类。

如果是SimpleRateThrottle的话,就需要设置scope和THROTTLE_RATES,分别对应着redis中的唯一标识,和访问限制频率。然后重写get_cache_key方法。

在如上示例我们的get_cache_key方法主要逻辑就是,对于已经登陆的用户,拿到用户主键作为唯一标识。对于未登陆的用户拿到IP地址作为唯一标识。然后传给SimpleRateThrottle的cache_format方法,这个方法里面会根据唯一标识和访问限制频率自动判断是否需要限流,如果需要限流还会返回还需要等待多少秒。

限流方案

单视图设置

views.py

class LoginView(APIView):
    throttle_classes = [MyThrottle, ]

然后发现前三次都可以正常访问,但是第四次就会出现如下:
在这里插入图片描述

全局设置

REST_FRAMEWORK = {
    "DEFAULT_THROTTLE_CLASSES": [
        "app01.tools.throttle.MyThrottle"
    ]
}

同时注意注释掉单视图的相关throttle_classes那一行,然后测试发现一样是第四次之后就被拒绝访问。

而且需要注意的是,全局设置还可以设置访问限制频率。

REST_FRAMEWORK = {
    "DEFAULT_THROTTLE_CLASSES": [
        "app01.tools.throttle.MyThrottle"
    ],
    "DEFAULT_THROTTLE_RATES": {"user": "3/m"}
}

再把限流组件中的THROTTLE_RATES注释掉,然后测试发现一样是第四次之后就被拒绝访问。

源码分析



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

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

相关文章

测试计划和测试报告

1、软件测试计划简介 测试计划,一般是主管写,在需求分析之后,测试工作开始之间做的一些准备划工作。一般包含以下内容:5W1H 目的、测试范围、测试进度安排、测试人员、测试环境、测试方法工具,风险评估 (w…

在Linux上利用mingw-w64生成exe文件

一、概要 1、elf与exe 在Linux上用gcc直接编译出来的可执行文件是elf格式的,在Windows上是不能运行的 Windows上可执行文件的格式是exe 利用mingw-w64可以在Linux上生成exe格式的可执行文件,将该exe文件拷贝到Windows上就可以运行 2、程序要留给用户…

C语言学习笔记之结构体(一)

目录 什么是结构体? 结构体的声明 结构体变量的定义和初始化 结构体成员的访问 结构体传参 什么是结构体? 在现实生活中的很多事物无法用单一类型的变量就能描述清楚,如:描述一个学生,需要姓名,年龄&a…

从 iPhone 上的短信中恢复已删除的图片的可靠方法

您可能在浏览消息聊天时不小心删除了一些文本和照片。事实上,如果这些消息对你来说意义重大,那对你来说可能会很麻烦。当发生意外情况时,您可能不想恢复整个聊天,而是恢复其中的附件。 好了,这篇文章主要是讲如何灵活…

LLM大语言模型微调方法和技术汇总

本文详细介绍了机器学习中的微调技术,特别是在预训练模型上进行微调的方法和技术。文章首先解释了什么是微调,即在预训练模型的基础上,通过特定任务的数据进行有监督训练,以提高模型在该任务上的性能。随后,详细介绍了…

ubuntu 安装java

在Ubuntu上安装Java通常有两种方式:使用包管理器安装默认仓库中的Java或者手动安装Oracle JDK。 使用APT包管理器安装: sudo apt update sudo apt install default-jdk 手动安装Oracle JDK: 首先,你需要从Oracle官网下载JDK的…

AI Agent概念、能力初探

AI Agent无疑是大语言模型当前最热门且最具前景的方向,也是通往AGI的必经之路,下面我们从基本概念和系统能力层面来逐步揭开AI Agent的神秘面纱。 一、概念解析 1、什么是AI Agent? AI Agent(人工智能代理)是一种能够…

(N-149)基于微信小程序网上商城系统

开发工具:IDEA、微信小程序 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 前端技术:vue、uniapp 服务端技术:springbootmybatisredis 本系统分微信小程序和管理后台两部分&a…

20240413,类和对象

对象:一切都可为对象,类:相同特性的对象;面向对象特性:封装,继承,多态 一,封装 CLASS 类名 { 访问权限 :属性/行为 } 实例化:通过一个类,创建一…

策略者模式(代码实践C++/Java/Python)————设计模式学习笔记

文章目录 1 设计目标2 Java2.1 涉及知识点2.2 实现2.2.1 实现两个接口飞行为和叫行为2.2.2 实现Duck抽象基类(把行为接口作为类成员)2.2.3 实现接口飞行为和叫行为的具体行为2.2.4 具体实现鸭子2.2.5 模型调用 3 C(用到了大量C2.0的知识&…

C语言-详解内存函数

文章目录 1.memcpy使用和模拟实现1.1 memcpy函数的使用规则1.2 memcpy函数的使用1.2 模拟实现memcpy函数 2.memmove 函数的使用和模拟实现2.1 memmove 函数使用规则2.2 memmove函数的使用2.3 模拟实现memmove函数2.3.1 从后往前移2.3.2 从前往后移 2.4 算法实现2.4.1 从前往后移…

C# 图形化的导航界面的设计方法

目录 一、涉及到的知识点 1、BackColor属性 2、FlatStyle属性 3、TextlmageRelation属性 4、其它共性设计 二、设计实例 1、 Resources.Designer.cs 2、Form1.Designer.cs 3、Form1.cs 4、运行结果 图形化导航用于代替文字导航,比如对Button控件 进行图形…

NzN的数据结构--归并排序及计数排序

篇接上文,今天要学习的是归并排序以及非比较排序--计数排序。这么励志的日更博主,你怎么能不三连一下呢? 目录 一、归并排序 1. 递归实现 2. 非递归实现 3. 特性总结 二、非比较排序--计数排序 三、排序算法复杂度及稳定性分析 一、归并…

vue3+element plus图片预览点击按钮直接显示图片的预览形式

1 需求 直接上需求&#xff1a; 我想要直接点击下面这个“预览”按钮&#xff0c;然后呈现出预览图片的形式 ok&#xff0c;需求知道了&#xff0c;下面让我们来看看如何实现吧 ~ 2 实现 template部分 <el-buttontype"primary"size"small"click&qu…

DRF多表关联的序列化和反序列化

DRF多表关联的序列化和反序列化 目录 DRF多表关联的序列化和反序列化序列化定制字段source一对多的序列化 多表关联的序列化方式1&#xff1a;在表模型中定义方法方式2&#xff1a;定制返回格式SerializerMethodField方式3&#xff1a;子序列化 多表关联的反序列化反序列化保存…

Ubuntu 上配置静态IP地址

Ubuntu 上配置静态IP地址编辑网络配置文件配置静态IP地址应用配置更改 Ubuntu 上配置静态IP地址 在终端中&#xff0c;运行以下命令来编辑网络配置文件 编辑网络配置文件 sudo cat /etc/netplan/01-netcfg.yaml在编辑器中&#xff0c;找到用于您的网络接口的配置部分。例如…

使用阿里云试用Elasticsearch学习:创建仪表板pivot、搜索discover和仪表板dashboard

文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/transform-examples.html#example-clientips 在kibana左栏打开Transforms&#xff0c;并创建Transforms&#xff08;转换&#xff09; Management > Stack Management > Data > T…

【Qt】界面优化

目录 一、QSS 1.1 基本语法 1.2 QSS设置方法 1.2.1 指定控件样式设置 1.2.2 全局样式设置 1.2.3 从文件加载样式表 1.2.4 使用Qt Designer编辑样式 1.3 选择器 1.3.1 介绍 1.3.2 子控件选择器 1.3.3 伪类选择器 1.4 样式属性(盒模型) 1.5 代码示例(登录界面) 二、…

自动化测试之httprunner框架hook函数实操

本篇介绍httprunner中hook函数的使用&#xff0c;以及通过编程能力实现建设自动化测试更全面的场景覆盖 前置&#xff1a; 互联网时代让我们更快的学习到什么是Httprunner 正文&#xff1a; 经过上文了解到这个框架怎么使用之后&#xff0c;我们开始来探讨一下我们为什么要用…

SecureCRT通过USB-Servial ch340串口无法连接单片机

通过USB To TTL连线 STM32F103-PRO&#xff0c;烧制程序到单片机上&#xff0c;通过SecureCRT通过USB-Servial ch340串口无法链接RS232升USB转TTL连接正确 开发板连接正确 问题&#xff1a;SecureCRT串口连接没有反应 问题分析&#xff1a;1、检查ch340串口驱动 查看设备管…