如何使用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节流的迷人旅程。我们已经揭开了内置节流类的秘密,掌握了配置知识,并探索了将节流应用于我们壮丽视图的艺术。此外,我们还看到了创建我们自己的自定义节流类的无限潜力,赋予我们的创意生命。