如何使用Django Rest Framework进行API调节
在使用著名的Django Rest Framework (DRF)构建API的领域中,我们必须巧妙地应对客户端可以在API端点上释放请求的速率所带来的挑战。调节机制通过有效地防止潜在滥用,保护宝贵资源以及促进客户端间公平使用的环境来拯救我们。在这篇深入的论述中,我们将展开一段富有启迪意义的旅程,探索在你的DRF驱动的API中实现调节技术的多面性领域。 请准备好迎接一场关注内建调节类的令人着迷的探索,以及打造适合你独特需求的自定义调节规则的复杂艺术。
内建调节类的非凡世界
在Django Rest Framework的雄伟领域中,等待着你去探索的是一个丰富多样的内建调节类的世界。让我们揭示其中的几个令人惊叹的类,各自拥有独特的目的:
- AnonRateThrottle:该类限制了匿名(未经身份验证)客户端在特定时间范围内可以发送的请求数量。
-
UserRateThrottle:该类限制了经过身份验证的客户端在给定时间间隔内可以发送的请求数量。
-
ScopedRateThrottle:使用该类,您可以根据范围为您的API的不同部分定义自定义调节速率。
为了发掘这些优秀调节类的真正潜力,您只需将它们整合到您的 Django 项目的 settings.py 文件中,嵌入在 REST_FRAMEWORK settings 的温暖怀抱中即可。
配置调节: 要为基于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限流领域的迷人探索。我们揭开了内置限流类的秘密,掌握了配置的知识,并探索了将限流应用于我们崇高视图的艺术。此外,我们还看到了定制自己的限流类的无限潜力,为我们的创意愿景赋予了生命。