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. 在.NET 8 RC1 版本中 MAUI、ASP.NET Core 和 EF8 的新特性

    从年初2 月份发布第一个预览版,经历7个预览版后,Microsoft 西雅图时间9月13日发布了 .NET 8  RC 1: https://devblogs.microsoft.com/dotnet ...

  2. MySQL实战实战系列 01 基础架构:一条SQL查询语句是如何执行的?

    这是专栏的第一篇文章,我想来跟你聊聊 MySQL 的基础架构.我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于 MySQL 的学习也是这样. ...

  3. 6-MySQL查询条件

    在MySQL中,高级查询是指使用更复杂的查询语句和操作符来检索和操作数据库中的数据.高级查询可以帮助您更精确地找到所需的信息,并提高查询的效率和灵活性. 以下是高级查询的一些常见应用场景和意义: 连接 ...

  4. 兴达易控Modbus转Profinet 网关连接 ACS510 变频器配置案例

    案例简介: 该案例为兴达易控Modbus转Profinet网关(XD-MDPN100)将ABB ACS510 变频器接入西门子 1200PLC.需要设备为西门子 PLC1200.ACS510 变频器. ...

  5. c语言代码练习2(1)

    //利用while循环计算1-10阶乘的和#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main( ) { int i ...

  6. Python socket实现简单聊天,同步输入和接收消息

    查的资料很多都是必须等待接收数据后才能再次输入.做了修改,使用多线程的形式,实现一边输入,一边接收 服务端代码 import socket import threading import sys im ...

  7. Linux系列教程——Linux文件查找、Linux压缩打包、Linux软件管理

    @ 目录 1 Linux文件查找 1.find查找概述 2.find查找示例 1.find名称查找 2.find大小查找 3.find类型查找 4.find时间查找 5.find用户查找 6.find ...

  8. 每天5分钟复习OpenStack(四) virsh 常用命令

    在上一章节中,我们拉起了第一台虚拟机,但是执行virsh shutdown 关机是无法关机的,需要使用virsh destroy 强制断电的命令来关机.为什么会这样了? 这里我们介绍下 QGA的概念 ...

  9. 如何为你的WSL2更换最新的6.5.7kernel

    1.如果你像我一样,喜欢折腾你的 WSL2 ,这里是安装内核 6.X 的方法. 2.这是一个坏主意,可能会导致系统不稳定.数据损坏和其他问题.也可能会没事的,但不要怪我. Arch linux的wsl ...

  10. "科来杯"第十届山东省大学生网络安全技能大赛决赛复现WP

    从朋友那里得来的附件,感觉题目有意思,简单复现一下 MISC 简单编码 1.题目信息 0122 061 1101011 0172 0122 0105 061 1011010 0127 0154 014 ...