DRF-限流

本文介绍了如何在Django REST Framework中设置全局和视图级别的限速策略,包括AnonRateThrottle、UserRateThrottle和ScopedRateThrottle等类,以及如何根据用户身份、请求频率和API路径进行定制化的请求限制。
摘要由CSDN通过智能技术生成

设置限制策略

可以使用DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES设置全局设置默认限制策略。例如。

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

中使用的速率描述可能DEFAULT_THROTTLE_RATES包括second、、minute或作为节流周期。hour``day

您还可以使用APIView基于类的视图在每个视图或每个视图集的基础上设置限制策略。

from rest_framework.response importResponse
from rest_framework.throttling importUserRateThrottle
from rest_framework.views importAPIView

classExampleView(APIView):
    throttle_classes =[UserRateThrottle]

    defget(self, request, format=None):
        content ={
            'status':'request was permitted'
        }
        returnResponse(content)

如果您将@api_view装饰器与基于函数的视图一起使用,则可以使用以下装饰器。

@api_view(['GET'])
@throttle_classes([UserRateThrottle])
def example_view(request, format=None):
    content ={
        'status':'request was permitted'
    }
    returnResponse(content)

也可以为使用@action装饰器创建的路由设置节流类。以这种方式设置的节流类将覆盖任何视图集级别的类设置。

@action(detail=True, methods=["post"], throttle_classes=[UserRateThrottle])
def example_adhoc_method(request, pk=None):
    content ={
        'status':'request was permitted'
    }
    returnResponse(content)

API 参考

AnonRateThrottle

AnonRateThrottle只会限制未经身份验证的用户。传入请求的 IP 地址用于生成一个唯一的密钥来限制。

允许的请求率由以下之一确定(按优先顺序)。

  • 类上的rate属性,可以通过覆盖AnonRateThrottle和设置属性来提供。
  • DEFAULT_THROTTLE_RATES['anon']设置。

AnonRateThrottle如果您想限制来自未知来源的请求率,则适用。

UserRateThrottle

UserRateThrottle将通过 API 将用户限制为给定的请求速率。用户 id 用于生成一个唯一的键来限制。未经身份验证的请求将回退到使用传入请求的 IP 地址来生成一个唯一的密钥来限制。

允许的请求率由以下之一确定(按优先顺序)。

  • 类上的rate属性,可以通过覆盖UserRateThrottle和设置属性来提供。
  • DEFAULT_THROTTLE_RATES['user']设置。

一个 API 可能同时有多个UserRateThrottles。为此,请覆盖UserRateThrottle并为每个类设置一个唯一的“范围”。

例如,可以通过使用以下类来实现多个用户节流率…

classBurstRateThrottle(UserRateThrottle):
    scope ='burst'

classSustainedRateThrottle(UserRateThrottle):
    scope ='sustained'

…以及以下设置。

REST_FRAMEWORK ={
    'DEFAULT_THROTTLE_CLASSES':[
        'example.throttles.BurstRateThrottle',
        'example.throttles.SustainedRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES':{
        'burst':'60/min',
        'sustained':'1000/day'
    }
}

UserRateThrottle如果您想对每个用户进行简单的全局速率限制,则适用。

ScopedRateThrottle

该类ScopedRateThrottle可用于限制对 API 特定部分的访问。.throttle_scope仅当正在访问的视图包含属性时才会应用此限制。然后,通过将请求的“范围”与唯一的用户 ID 或 IP 地址连接起来,将形成唯一的节流键。

允许的请求率由DEFAULT_THROTTLE_RATES使用请求“范围”中的键的设置确定。

例如,给定以下视图…

classContactListView(APIView):
    throttle_scope ='contacts'
    ...

classContactDetailView(APIView):
    throttle_scope ='contacts'
    ...

classUploadView(APIView):
    throttle_scope ='uploads'
    ...

…以及以下设置。

REST_FRAMEWORK ={
    'DEFAULT_THROTTLE_CLASSES':[
        'rest_framework.throttling.ScopedRateThrottle',
    ],
    'DEFAULT_THROTTLE_RATES':{
        'contacts':'1000/day',
        'uploads':'20/day'
    }
}

用户请求ContactListViewContactDetailView将被限制为每天总共 1000 个请求。用户请求UploadView将被限制为每天 20 个请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值