如何使用Django Rest Framework限制API请求速率


在使用著名的Django Rest Framework (DRF)构建API的过程中,必须巧妙地应对管理客户端向API端点发送大量请求速率的挑战。节流机制通过有效地防止潜在的滥用、保护宝贵的资源以及促进客户端之间公平使用来提供帮助。在这篇深入探讨的文章中,我们将踏上一次启蒙之旅,探索在DRF驱动的API中实现节流技术的各个方面。准备好深入探索可用的内置节流类,以及根据您的独特需求定制节流规则的技巧吧。

强大的内置节流类

在Django Rest Framework的领域中,众多内置节流类等待您的查阅。让我们揭开其中一些令人敬畏的类的面纱,每个类都有其独特的用途。

  • AnonRateThrottle:此类限制匿名(未经身份验证)客户端在特定时间段内可以发出的请求数量。

  • UserRateThrottle:此类限制已认证客户端在给定时间间隔内可以发出的请求数量。

  • ScopedRateThrottle:使用此类,您可以使用范围为API的不同部分定义自定义节流速率。

要释放这些强大的节流类的真正潜力,您只需将它们集成到Django项目settings.py文件的REST_FRAMEWORK设置中即可。

配置节流:要为基于DRF的API配置节流,请按照以下步骤操作

  • 打开项目的settings.py文件。

  • 找到REST_FRAMEWORK字典,并将所需的节流类添加到DEFAULT_THROTTLE_CLASSES列表中。

  • 在DEFAULT_THROTTLE_RATES字典中定义节流速率,将速率与每个类关联。

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
        'rest_framework.throttling.ScopedRateThrottle',
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/hour',
        'user': '1000/day',
        'custom': '50/hour',
    }
}

在这个例子中,我们定义了以下节流速率:

  • 匿名客户端每小时最多可以发出100个请求。

  • 已认证客户端每天最多可以发出1000个请求。

  • 自定义范围每小时允许50个请求。

将节流应用于视图:节流规则可以通过两种方式应用于视图:基于类的视图和基于函数的视图。

1. 基于类的视图

  • 在您的视图类中使用throttle_classes属性并指定所需的节流类。

  • 此外,您可以设置throttle_scope属性来为ScopedRateThrottle指定自定义范围。

使用基于类的视图的示例

from rest_framework.throttling import UserRateThrottle, ScopedRateThrottle
from rest_framework.views import APIView

class MyApiView(APIView):
    throttle_classes = [UserRateThrottle, ScopedRateThrottle]
    throttle_scope = 'custom'

    def get(self, request):
        # Your view logic here
        pass

2. 基于函数的视图

  • 在您的视图函数上使用@throttle_classes装饰器并提供所需的节流类。

使用基于函数的视图的示例

from rest_framework.throttling import UserRateThrottle, ScopedRateThrottle
from rest_framework.decorators import api_view, throttle_classes

@api_view(['GET'])
@throttle_classes([UserRateThrottle, ScopedRateThrottle])
def my_api_view(request):
    # Your view logic here
    pass

创建自定义节流:如果内置节流类不能满足您的需求,您可以通过扩展SimpleRateThrottle类并实现get_cache_key()方法来创建自定义节流类。scope属性定义了自定义节流类的范围。

自定义节流类的示例

from rest_framework.throttling import SimpleRateThrottle

class CustomThrottle(SimpleRateThrottle):
    scope = 'custom'

    def get_cache_key(self, request, view):
        # Custom logic to generate the cache key
        pass

节流不会产生对用户可见的任何输出。相反,它对API请求实施速率限制。

例如,如果客户端超过UserRateThrottle设置的速率限制,服务器将返回类似于以下内容的HTTP响应:

HTTP/1.1 429 Too Many Requests
Content−Type: application/json
Retry−After: 60
{
    "detail": "Request was throttled. Expected availability in 60 seconds."
}

结论

因此,尊敬的读者,我们结束了使用Django Rest Framework进行API节流的迷人旅程。我们已经揭开了内置节流类的秘密,掌握了配置知识,并探索了将节流应用于我们壮丽视图的艺术。此外,我们还看到了创建我们自己的自定义节流类的无限潜力,赋予我们的创意生命。

更新于:2023年7月10日

508 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告