如何使用 Django Rest Framework 限制 API

pythondjangoprogramming

在使用著名的 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):
    # 您的视图逻辑在此
    pass

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

自定义节流类示例

from rest_framework.throttling import SimpleRateThrottle

class CustomThrottle(SimpleRateThrottle):
    scope = 'custom'

    def get_cache_key(self, request, view):
        # 自定义逻辑来生成缓存键
        pass

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

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

HTTP/1.1 429 请求过多
Content−Type: application/json
Retry−After: 60
Retry−After: 60
{
    "detail": "Request was throttled. Expected availability in 60 seconds."
}

结论

亲爱的读者,我们结束了使用 Django Rest Framework 进行 API 节流领域的令人着迷的探险。我们揭开了内置节流类的秘密,掌握了配置知识,探索了将节流应用于我们壮丽景色的艺术。此外,我们还看到了制作我们自己的自定义节流类的无限潜力,让我们的创意愿景得以实现。


相关文章