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

DRF限流的更多相关文章

  1. DRF限流Throttling

    限流Throttling 可以对接口访问的频次进行限制,以减轻服务器的压力 使用 可以在配置文件中,使用 DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RAT ...

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

    DRF限流组件(源码分析) 限流,限制用户访问频率,例如:用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次, 防止盗刷. 对于匿名用户,使用用户IP作为唯一标识. 对于登录用户,使用 ...

  3. 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用

    因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...

  4. drf 认证、权限、限流、过滤、排序、分页器

    认证Authentication 准备工作:(需要结合权限用) 1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py creates ...

  5. DRF的限流功能

    限流,可以对接口访问的频次进行限制,以减轻服务器压力. 全局配置 在settings.py上添加 REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( 'r ...

  6. day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档

    目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...

  7. drf认证、权限、限流

    认证Authentication(5星) 认证逻辑及编写步骤 逻辑 认证类:用来校验用户是否登录,如果登录了,继续往下走,如果没有登录,直接返回 编写步骤 -第一步:写一个类,继承BaseAuthen ...

  8. 2. DRF 认证、权限、限流、分页、过滤、序列 化

    2.1 user/urls.py   ModelViewSet注册路由三部曲 from django.urls import include, path from user import views ...

  9. DRF的限流配置

    在settings.py中添加配置 REST_FRAMEWORK = { #3.限流(防爬虫) 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.thrott ...

  10. 前后端分离djangorestframework——限流频率组件

    频率限制 什么是频率限制 目前我们开发的都是API接口,且是开房的API接口.传给前端来处理的,也就是说,只要有人拿到这个接口,任何人都可以通过这个API接口获取数据,那么像网络爬虫的,请求速度又快, ...

随机推荐

  1. Windows安装JDK 8/11/17教程

    JDK,全称Java Development Kit,即Java开发工具包,它是整个Java开发的核心,包含了Java运行环境(JVM+Java系统类库)和Java工具.目前JDK 8.11.17是长 ...

  2. vue中watch侦听器,deep和immediate的用法

    1.deep深度监听的用法 当监听一个对象时,可能想监听整个对象的变化,而不仅仅是某个属性.但在默认情况下,如果你正在监听formData对象并且修改了formData.username,对应的侦听器 ...

  3. Mybatis中的设计模式

    最近在看<通用源码阅读指导书:Mybatis源码详解>,这本书一一介绍了Mybatis中的各个包的功能,同时也涉及讲了一些阅读源码的技巧,还讲了一些源码中涉及的设计模式,这是本篇文章介绍的 ...

  4. junit4单元测试报错Invalid project specified

    junit4单元测试报错Invalid project specified. 前天在进行单元测试的时候出现了Invalid project specified的报错查了一下发现是项目名字的问题.项目名 ...

  5. Java核心知识体系5:反射机制详解

    Java核心知识体系1:泛型机制详解 Java核心知识体系2:注解机制详解 Java核心知识体系3:异常机制详解 Java核心知识体系4:AOP原理和切面应用 1 介绍 无论是那种语言体系,反射都是必 ...

  6. 安装 Android x86 并开启 arm 兼容

    安装 Android x86 并开启 arm 兼容 Win 11 下开启了 Hyper-v,尝试了各种安卓模拟器,要么不能设置代理(BlueStacks),要么/system目录没办法设置. 获取 A ...

  7. ansible-playbook应用

    ansible-playbook剧本: 如上使用Ad-hoc方式点对点命令执行,可以管理远程主机,如果服务器数量很多,配置信息比较多,还可以利用ansible playbook编写剧本.从而以非常简单 ...

  8. 码编译安装nginx

    1.解释源码安装nginx软件的预编译,编译以及安装,分别是在做什么,需要注意什么? 预编译(configure): ./configure 00prefix=/usr/local/nginx --u ...

  9. IOI2020 国家集训队作业 Part 1

    日期不对,但要保证顺序正确方便查找少了啥题. 计算几何和实在不会的题没写. 9.20 CF504E Misha and LCP on Tree *3000 二分,hash,树剖 CF505E Mr. ...

  10. YbtOJ 质数与约数 4.统计元素

    搜不到题解,乐. 由题意,\(a_i\) 对答案有贡献当且仅当 \(i\in{[l,r]}\) 且对于 \(\forall a_j| {a_i},j\notin[l,r]\). 则对于每个 \(a_i ...