一、限流
限流类似于权限,因为它确定是否应对请求进行授权。限制指示临时状态,用于控制客户端可以向 API 发出的请求速率。
与权限一样,可以使用多个限制。您的 API 可能对未经身份验证的请求设置了限制性限制,对经过身份验证的请求的限制性限制较少。
您可能希望使用多个限制的另一种情况是,由于某些服务特别占用资源,因此您需要对 API 的不同部分施加不同的约束。
如果要同时施加突发节流速率和持续节流速率,也可以使用多个节流阀。例如,您可能希望将用户限制为每分钟最多 60 个请求,每天最多 1000 个请求。
限制不一定仅指速率限制请求。例如,存储服务可能还需要限制带宽,而付费数据服务可能希望限制正在访问的一定数量的记录。
REST 框架提供的应用程序级限制不应被视为安全措施或针对暴力破解或拒绝服务攻击的保护。故意的恶意行为者将始终能够欺骗 IP 源,应用程序级限制旨在实现策略,例如不同的业务层和防止服务过度使用的基本保护。
1.全局设置
REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', 'rest_framework.throttling.UserRateThrottle' ], 'DEFAULT_THROTTLE_RATES': { 'anon': '100/day', 'user': '1000/day' } }
2.视图设置
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)
3.装饰器设置
@api_view(['GET']) @throttle_classes([UserRateThrottle]) def example_view(request, format=None): content = { 'status': 'request was permitted' } return Response(conten
4.装饰器创建的路由设置限制类
@action(detail=True, methods=["post"], throttle_classes=[UserRateThrottle]) def example_adhoc_method(request, pk=None): content = { 'status': 'request was permitted' } return Response(content)
二、命名限流
该类可用于限制对 API 特定部分的访问。仅当正在访问的视图包含属性时,才会应用此限制。然后,通过将请求的“作用域”与唯一的用户 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' } } 用户对任一或的用户请求将被限制为每天
三、限流缓存
REST框架提供的限制类使用Django的缓存后端。您应确保已设置适当的缓存设置。后端的默认值应该适用于简单的设置。请参阅 Django 的缓存文档以获取更多详细信息。LocMemCache
如果需要使用 除 以外的高速缓存,可以通过创建自定义限制类并设置属性来执行此操作。例如:
from django.core.cache import caches class CustomAnonRateThrottle(AnonRateThrottle): cache = caches['alternate']