我有两个api视图(django rest framework):
class ApiView1(APIView):
...
throttle_classes = (UserRateThrottle, )
和api 2:
class ApiView2(APIView):
...
throttle_classes = (UserRateThrottle, )
和我的设置:
REST_FRAMEWORK = {
...,
'DEFAULT_THROTTLE_RATES': {
'user': '5/minute'
}
}
当请求ApiView1五次时,每件事都没问题,但在请求ApiView2之后,我得到一个http 429状态代码:
Request was throttled. Expected available in 45 seconds.
问题:我可以对每个用户和每个视图使用限制吗?如果是的话,怎么做?
答案 0 :(得分:2)
是的,你可以。
对于基于类的视图:
class YourView(APIView):
throttle_classes = (UserRateThrottle, )
def get(self, request, format=None):
content = { ... Your response here ... }
return Response(content)
对于基于功能的视图,您可以使用装饰器:@throttle_classes([UserRateThrottle])
参考:http://www.django-rest-framework.org/api-guide/throttling/
答案 1 :(得分:0)
因为它是django-rest-framework的功能。
ScopedRateThrottle类可用于限制对API特定部分的访问。仅当所访问的视图包含.throttle_scope属性时,才会应用此油门。然后,通过将请求的“范围”与唯一的用户ID或IP地址串联起来,即可形成唯一的限制键。
允许的请求速率由DEFAULT_THROTTLE_RATES设置使用请求“范围”中的键确定。
由于您未在任何视图中设置油门范围,因此ApiView1
和ApiView2
都使用相同的油门作用域scope
。因此,它们具有相同的限制。如果一个视图被过度访问,则另一个视图也不可接受。
在您的情况下,您应该在apiview中设置不同的油门_scope并将范围添加到REST_FRAMEWORK.DEFAULT_THROTTLE_RATES
。