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. 如何通过拼多多订单API接口获取订单详情

    要获取拼多多订单详情,可以使用以下接口: 1. API名称:pdd.order.detail.get 接口说明:此接口用于查询某个订单的详情信息. API文档地址:前往注册 调用该接口需要提供以下参数 ...

  2. RK3568开发笔记(六):开发板烧写ubuntu固件(支持mipi屏镜像+支持hdmi屏镜像)

    前言   编译了uboot,kernel,buildroot后,可以单独输入固件,也可以整体打包成rootfs进行一次性输入,rootfs直接更新升级这个方式目前也是常用的.   烧写器软件:RKDe ...

  3. 我们能从PEP 703中学到什么

    PEP703是未来去除GIL的计划,当然现在提案还在继续修改,但大致方向确定了. 对于实现细节我没啥兴趣多说,挑几个我比较在意的点讲讲. 尽量少依赖原子操作的引用计数 没了GIL之后会出现两个以上的线 ...

  4. 如何使用Java + React计算个人所得税?

    前言 在报表数据处理中,Excel公式拥有强大而多样的功能,广泛应用于各个业务领域.无论是投资收益计算.财务报表编制还是保险收益估算,Excel公式都扮演着不可或缺的角色.传统的做法是直接依赖Exce ...

  5. WPF中的DesignerProperties

    在WPF开发过程中,最容易遇到的一个问题:就是在自定义控件的过程中写好业务逻辑后,在调用的地方,打开.xmal文件设计器时出现异常,经过排查发现是由于自定义控件初始化过程中需要进行赋值操作.为了能够让 ...

  6. c语言代码练习3

    //查看数字是否存在于数组中#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int i = 0; int ...

  7. 深入理解 python 虚拟机:原来虚拟机是这么实现闭包的

    深入理解 python 虚拟机:原来虚拟机是这么实现闭包的 在本篇文章当中主要从虚拟机层面讨论函数闭包是如何实现的,当能够从设计者的层面去理解闭包就再也不用死记硬背一些闭包的概念了,因为如果你理解闭包 ...

  8. MySQL8.0默认加密连接方式

    Mysql8.0开始默认采用新的caching_sha2_password的身份验证方式,常规老接口会因此无法连接数据库. 为继续使用老的身份验证方式,需显式指定身份验证方式为 mysql_nativ ...

  9. ELK-WEB中文版化-redis高性能加速

    1.ELK-WEB中文汉化版支持:(kibana所在机器执行)Kibana WEB平台所有的字段均显示为英文,目前5.x版本默认没有中文汉化版插件或者汉化包(7.x版本支持汉化默认有汉化),感谢Git ...

  10. 🎊OpenTiny Vue 3.11.0 发布:增加富文本、ColorPicker等4个新组件,迎来了贡献者大爆发!

    你好,我是 Kagol. 非常高兴跟大家宣布,2023年10月24日,OpenTiny Vue 发布了 v3.11.0 . OpenTiny 每次大版本发布,都会给大家带来一些实用的新特性,8.14 ...