设置限制策略
可以使用DEFAULT_THROTTLE_CLASSES
和DEFAULT_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'
}
}
用户请求ContactListView
或ContactDetailView
将被限制为每天总共 1000 个请求。用户请求UploadView
将被限制为每天 20 个请求。