DRF的限流组件(源码分析)

这篇具有很好参考价值的文章主要介绍了DRF的限流组件(源码分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DRF限流组件(源码分析)

限流,限制用户访问频率,例如:用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次, 防止盗刷。

  • 对于匿名用户,使用用户IP作为唯一标识。
  • 对于登录用户,使用用户ID或名称作为唯一标识。
缓存={
	用户标识:[12:33,12:32,12:31,12:30,12,]    1小时/5次   12:34   11:34
{

1. 配置缓存

# settings.py
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": "qwe123",
        }
    }
}

2. 自定义限流类

# -*- encoding:utf-8 -*-
# @time: 2023/4/21 15:41
# @author: ifeng
from django.core.cache import cache as default_cache
from rest_framework import exceptions
from rest_framework import status
from rest_framework.throttling import SimpleRateThrottle


class ThrottledException(exceptions.APIException):
    status_code = status.HTTP_429_TOO_MANY_REQUESTS
    default_code = 'throttled'


class MyRateThrottle(SimpleRateThrottle):
    cache = default_cache  # 访问记录存放在django的缓存中(需设置缓存)
    scope = 'user'  # 构造缓存中的key
    cache_format = 'throttle_%(scope)s_%(ident)s'

    # 设置其他访问评率, 例如: 一分钟允许访问10次
    # 其他: 's': 'sec', 'm': 'min', 'h': 'hour', 'd': 'day'
    THROTTLE_RATES = {'user': '10/m'}

    def get_cache_key(self, request, view):
        if request.user:
            ident = request.user.id
        else:
            ident = self.get_ident(request)  # 获取请求用户IP(request中找请求头)

        # throttle_u # throttle_user_11.11.11.11ser_2

        return self.cache_format % {'scope': self.scope, 'ident': ident}

    def throttle_failure(self):
        wait = self.wait()
        detail = {
            'code': 1005,
            'data': '访问频率限制',
            'detail': '需要等待 %s s才能访问' % (int(wait))
        }
        raise ThrottledException(detail)

3. 使用限流类

  • 局部配置(views)
class UserView(APIView):
    throttle_classes = [MyRateThrottle, ]  # 限流
  • 全局配置(settings)
REST_FRAMEWORK = {
    # 限流
    "DEFAULT_THROTTLE_CLASSES": ["app01.throttle.MyRateThrottle", ],
    "DEFAULT_THROTTLE_RATES": {
        "user": "10/m",
        # "xx":"100/h"
    }
}

4. 多个限流类

本质,每个限流的类中都有一个 allow_request 方法,此方法内部可以有三种情况:

  • 返回True,表示当前限流类允许访问,继续执行后续的限流类。
  • 返回False,表示当前限流类不允许访问,继续执行后续的限流类。所有的限流类执行完毕后,读取所有不允许的限流,并计算还需等待的时间。
  • 抛出异常,表示当前限流类不允许访问,后续限流类不再执行。

5. 源码分析

  1. 这是限流大体的执行逻辑, 后面将对allow_reqeust中具体分析

DRF的限流组件(源码分析)

  1. allow_request()在自定义的类里面没定义, 所以我们到父类SimpleRateThrottle执行allow_request()方法

DRF的限流组件(源码分析)文章来源地址https://www.toymoban.com/news/detail-420546.html

到了这里,关于DRF的限流组件(源码分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • drf——Request源码分析、序列化组件、序列化类的使用(字段类和参数)、反序列化校验和保存

    views.py中 urls.py中 序列化类 字段 字段构造方式 BooleanField BooleanField() NullBooleanField NullBooleanField() CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True) EmailField EmailField(max_length=None, min_length=None, allow_blank=False) RegexField RegexField(regex, max_length=None, min_length=None, a

    2024年02月05日
    浏览(29)
  • 【限流】4 种常见的限流实现方案

    在微服务应用中,考虑到技术栈的组合,团队人员的开发水平,以及易维护性等因素,一个比较通用的做法是,利用 AOP 技术 + 自定义注解实现 对特定的方法或接口进行限流。 下面基于这个思路来分别介绍下几种常用的限流方案的实现: 基于 guava 限流实现(单机版) 基于

    2024年02月15日
    浏览(29)
  • 基于 ActionFilters 的限流库DotNetRateLimiter使用

    在构建API项目时,有时出于安全考虑,防止访问用户恶意攻击,希望限制此用户ip地址的请求次数,减轻拒绝服务攻击可能性,也称作限流。接下来,我们就来学习开源库 DotNetRateLimiter 如何轻松实现限流。 安装Nuget包 在新建立的 WebAPI 项目中,通过 Nuget 包管理器安装 DotNetR

    2024年02月08日
    浏览(25)
  • RabbitMQ中的限流、return机制、死信队列

    目录 优点 缺点 1、限流 2、return机制 3、死信队列 高可用性: RabbitMQ支持集群和镜像队列等多种方式实现高可用性,保证系统稳定运行。 可靠性强: RabbitMQ使用AMQP协议作为消息传递的标准,能够确保消息传递的可靠性和有序性。 灵活性强: RabbitMQ支持多种消息模式,包括点

    2024年02月08日
    浏览(29)
  • 【Sentinel】Sentinel与gateway的限流算法

    线程隔离有两种方式实现: 线程池隔离(Hystrix默认采用) 信号量隔离(Sentinel默认采用) 服务I需要远程调用服务A、服务B,则创建两个线程池,分别用来处理服务I–服务A,和服务I–服务B的请求。和线程池隔离不同的是,信号量隔离比较轻量级,就维护一个计数器就好,不

    2024年02月09日
    浏览(37)
  • 【知识点随笔分享 | 第九篇】常见的限流算法

    目录 前言: 1.固定窗口限流:  缺点:  2.滑动窗口限流:  优点: 滴桶限流: 缺点: 令牌桶限流:  优点: 总结:           当今互联网时代,随着网络流量的快速增长和系统负载的不断加重,限流算法作为一种重要的网络管理工具变得愈发重要。限流算法通过控制系

    2024年02月04日
    浏览(34)
  • Sentinel dashboard无法查询到应用的限流配置问题以及解决

    使用sentinle-dashboard控制台 项目整体升级后,发现控制台上无法看到流控规则了 之前的问题是无法注册上来 现在是注册上来了。结果看不到流控规则配置了。 关于注册不上来的问题,可以看另一篇文章 https://blog.csdn.net/a15835774652/article/details/132234943 项目的组件版本如下 sprin

    2024年02月11日
    浏览(28)
  • 【springboot】spring的Aop结合Redis实现对短信接口的限流

    场景: 为了限制短信验证码接口的访问次数,防止被刷,结合Aop和redis根据用户ip对用户限流 首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而注解是通过 AOP 来解析的,所以我们还需要加上 AOP 的依赖,最终的依赖如下:

    2024年02月05日
    浏览(39)
  • ASP.NET Core 6框架揭秘实例演示[38]:两种不同的限流策略

    承载ASP.NET应用的服务器资源总是有限的,短时间内涌入过多的请求可能会瞬间耗尽可用资源并导致宕机。为了解决这个问题,我们需要在服务端设置一个阀门将并发处理的请求数量限制在一个可控的范围,即使会导致请求的延迟响应,在极端的情况会还不得不放弃一些请求。

    2024年02月08日
    浏览(39)
  • drf重写authenticate方法实现多条件登录(源码分析)

    JWT拓展的登录视图中, 在接受到用户名和密码时, 调用的也是Django的认证系统中提供的authenticate()来检查用户名与密码是否正确. 我们可以通过修改Django系统的认证后端来支持登录账号既可以是 用户名 也可以是 手机号 修改重写思路是: 我们需要重写什么位置? 下面是以 from re

    2024年02月03日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包