首页 > 其他分享 >DRF限流

DRF限流

时间:2023-07-18 09:25:27浏览次数:31  
标签:限制 请求 DEFAULT 限流 THROTTLE UserRateThrottle DRF

https://www.django-rest-framework.org/api-guide/throttling/

限制、控制客户端可以向 API 发出的请求的速率。

设置限流策略

默认限制策略可以使用 DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES 设置进行全局设置。例如:

REST_FRAMEWORK = {
    # 设置限流器类
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    # 限流速率
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',  # anon:这个key名是AnonRateThrottle类的专属,表示AnonRateThrottle类的限流速率
        'user': '1000/day'  
    }
}

DEFAULT_THROTTLE_RATES 中使用的速率描述可以包括 secondminutehourday 作为节流周期。

视图类局部设置

from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

class ExampleView(APIView):
    throttle_classes = [UserRateThrottle]

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)

AnonRateThrottle匿名用户限制

AnonRateThrottle 只会限制未经身份验证的用户。请求的 IP 地址用于生成用于限制的唯一密钥。

限制速率由以下之一确定(按优先级顺序)

  • 类属性rate。可以通过子类化AnonRateThrottle并覆盖rate属性来提供限制速率
  • DEFAULT_THROTTLE_RATES['anon'] 设置。

UserRateThrottle 用户速率限制

UserRateThrottle 会将用户通过 API 限制为给定的请求率。用户 ID 用于生成唯一的密钥来进行限制。未经身份验证的请求将回退到使用传入请求的 IP 地址来生成唯一的密钥来进行限制。

限制速率由以下之一确定(按优先级顺序)

  • 类属性rate。可以通过子类化AnonRateThrottle并覆盖rate属性来提供限制速率
  • DEFAULT_THROTTLE_RATES['user'] 设置。

一个视图类可以由多个UserRateThrottle,需要子类化多个UserRateThrottle,然后重写scope属性。

使用场景:

针对每用户每分钟限制100请求

针对每用户每小时限制1000请求

class UserMinRateThrottle(UserRateThrottle):
    scope = 'limit_per_minute'

class UserHourRateThrottle(UserRateThrottle):
    scope = 'limit_per_minute'
    
    
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'example.throttles.UserMinRateThrottle',
        'example.throttles.UserHourRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'limit_per_minute': '60/min',
        'limit_per_minute': '1000/hour'
    }
}

ScopedRateThrottle 范围速率限制

用于限制特定的API访问,仅当正在访问的视图包含 .throttle_scope 属性时才会应用此限制。

然后,通过将请求的“throttle_scope ”与唯一的用户 ID 或 IP 地址连接起来,形成唯一的限制键。

class ContactListView(APIView):
    throttle_scope = 'contacts'
    ...

class ContactDetailView(APIView):
    throttle_scope = 'contacts'
    ...

class UploadView(APIView):
    throttle_scope = 'uploads'
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.ScopedRateThrottle',
    ],
    'DEFAULT_THROTTLE_RATES': {
        'contacts': '1000/day',
        'uploads': '20/day'
    }
}

用户对 ContactListViewContactDetailView 的请求每天的请求总数将被限制为 1000 个。

用户对 UploadView 的请求将被限制为每天 20 个请求。

高并发注意事项

内置的节流阀实现对竞争条件开放,因此在高并发情况下,它们可能允许一些额外的请求通过。

如果您的项目依赖于保证并发请求期间的请求数量,则您将需要实现自己的节流类。

自定义限流类

https://www.django-rest-framework.org/api-guide/throttling/#custom-throttles

标签:限制,请求,DEFAULT,限流,THROTTLE,UserRateThrottle,DRF
From: https://www.cnblogs.com/juelian/p/17561850.html

相关文章

  • DRF分页器
    https://www.django-rest-framework.org/api-guide/pagination/DRF给我们提供了几个分页器类,比较常用的2个是:LimitOffsetPagination,基于offset、limit参数来控制分页。PageNumberPagination,基于page参数来控制分页。只有当你使用GenericView或视图集ViewSet时才会自动进行......
  • Django+DRF+Vue 网页开发环境安装(windows/Linux)
    博客地址:https://www.cnblogs.com/zylyehuo/总览一、安装Djangopipinstalldjango==3.2二、安装MySQL驱动程序pipinstallpymysql三、安装DRFpipinstalldjangorestframework-ihttps://pypi.douban.com/simple四、安装Vue(一)脚本化引入<scriptsrc=......
  • spring boot sentinel设置限流规则
    SpringBootSentinel设置限流规则引言在高并发的系统中,为了保证系统的稳定性和可靠性,我们常常需要对系统的接口进行限流操作。限流是一种流量控制的手段,通过控制接口的访问频率或者并发数,保护系统不被过多的请求压垮。在SpringBoot中,我们可以使用Sentinel来进行接口的限流。S......
  • SpringBoot 服务接口限流,搞定!
    来源:blog.csdn.net/qq_34217386/article/details/122100904  在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。限流可以认为服务降级的一种,限流通过限制请求的流量以达到保护系统的目的。  一般来说,系统的吞吐量是可以计算出一个阈值的,为了保证系统的稳定运......
  • 基于RateLimiter限流组件实践
    在系统高可用设计中,接口限流是一个非常重要环节,一方面是出于对自身服务器资源的保护,另一方面也是对依赖资源的一种保护措施。比如对于Web应用,限制单机只能处理每秒1000次的请求,超过的部分直接返回错误给客户端。虽然这种做法带来了不好的用户使用体验,但是它是在极端并发下的短......
  • springcloud -sentinel 用户自定义限流错误处理(仅限限流异常,其他异常请使用fallback属
    pom依赖<!--SpringCloudailibabanacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>......
  • SpringBoot之限流方案
    目录1限流方案1.1引言1.2常用限流策略1.3基于guava限流实现1.3.1引入guava依赖1.3.2自定义限流注解1.3.3限流AOP类1.3.4测试接口1.4基于sentinel限流实现1.4.1引入sentinel核心依赖包1.4.2自定义限流注解1.4.3自定义AOP类实现限流1.4.4自定义测试接口1.5基于redis+l......
  • oceanbase的SQL限流
    核心营业crm1生产偶尔会CPU突然飙升,多次定位,基本上都是一个SQL,该SQL需要在前台进行传参,但是参数业务侧偶尔忘记添加,为了一劳永逸的解决问题,决定对该SQL进行限流。限流操作有两种:1.在ocp上对SQL白屏操作,直接限流2.绑定相关执行计划#这里不演示绑定过程,直接贴出绑定的hint ......
  • Django REST framework drf 后端分页
    使用view.pyfromrest_frameworkimportpaginationclassdefault_pagination(pagination.PageNumberPagination):page_size=15#分页的条数page_query_param='page'page_size_query_param='size' classrun_sh(generics.ListCreate......
  • DRF 入门教程 4
    这里我都写在了有道笔记,后续的基础教程DRF入门教程4DRF入门教程5DRF入门教程6......