节流-Django REST框架
节流
http/1.1 420增强你的冷静
节流类似于权限,因为它决定是否应该授权请求。节流阀表示临时状态,用于控制客户端向API发出请求的速率。
与权限一样,可以使用多个节流阀。对于未经身份验证的请求,您的API可能有一个限制性节流阀,对于经过身份验证的请求,您的API可能有一个限制较
另一个您可能希望使用多个节流阀的场景是,如果您需要对API的不同部分施加不同的约束,因为某些服务是特别资源密集型的。
如果您想要强制执行突发节流率和持续节流率,也可以使用多个节流器。例如,您可能希望将用户限制为每分钟最多60个请求,以及每天1000个请求。
节流阀不一定只指限速请求.例如,存储服务可能还需要节流带宽,而付费数据服务可能希望限制访问的记录数量。
节流是如何确定的
与权限和身份验证一样,REST框架中的节流总是定义为类列表。
在运行视图的主体之前,检查列表中的每个节流阀。如果油门检查失败,则exceptions.Throttled
将引发异常,并且视图的主体将不会运行。
设置节流策略
默认节流策略可以全局设置,使用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 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)
或者,如果您使用的是@api_view
具有基于功能的视图的装饰器。
@api_view(['GET'])
@throttle_classes([UserRateThrottle])
def example_view(request, format=None):
content = {
'status': 'request was permitted'
}
return Response(content)
如何识别客户
这个X-Forwarded-For
http标头和REMOTE_ADDR
WSGI变量用于唯一标识用于节流的客户端IP地址。如果X-Forwarded-For
标头将被使用,否则将使用REMOTE_ADDR
将使用来自WSGI环境的变量。
如果需要严格标识唯一的客户端IP地址,则首先需要通过设置NUM_PROXIES
背景。此设置应为零或更多的整数。如果设置为非零,则客户端ip将标识为X-Forwarded-For
标头,一旦任何应用程序代理IP地址第一次被排除。如果设置为零,则REMOTE_ADDR
值将始终用作标识IP地址。
重要的是要理解,如果您配置NUM_PROXIES
设置,则所有客户端后面都有一个唯一的纳特网关将被视为单个客户端。
进一步说明X-Forwarded-For
标头工作,并且标识远程客户端ip可以是在这里发现的.
设置缓存
REST框架提供的节流类使用Django的缓存后端。你应该确保你已经设置了适当的缓存设置...的默认值LocMemCache
后端应该可以用于简单的设置。见Django‘s缓存文档更多细节。
如果您需要使用'default'
,您可以通过创建自定义节流类并设置cache
属性。例如:
from django.core.cache import caches
class CustomAnonRateThrottle(AnonRateThrottle):
cache = caches['alternate']
您还需要记住在'DEFAULT_THROTTLE_CLASSES'
设置键,或使用throttle_classes
视图属性
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
并为每个类设置唯一的“作用域”。
例如,可以使用以下类实现多个用户节流率.
class BurstRateThrottle(UserRateThrottle):
scope = 'burst'
class SustainedRateThrottle(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
使用请求“作用域”中的键设置。
例如,给定以下视图..。
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'
}
}
用户请求ContactListView
或ContactDetailView
将被限制在每天1000次的请求范围内。用户请求UploadView
将被限制为每天20次请求。
定制节流阀
若要创建自定义节流阀,请重写BaseThrottle
和实施.allow_request(self, request, view)
...方法应该返回True
如果请求被允许,以及False
不然的话。
也可以选择覆盖.wait()
方法。如果实施,.wait()
应该返回建议等待的秒数,然后再尝试下一个请求,或None
...这个.wait()
方法只在下列情况下才会调用。.allow_request()
以前已经回来了False
.
如果.wait()
方法,并对请求进行节流,然后将Retry-After
报头将包括在响应中。
例
以下是一个速度节流阀的例子,它将随机节流1每10个请求。
import random
class RandomRateThrottle(throttling.BaseThrottle):
def allow_request(self, request, view):
return random.randint(1, 10) != 1
网友评论