每个用户和每个视图的django rest框架限制

时间:2018-05-09 13:46:39

标签: python django-rest-framework throttling

我有两个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.

问题:我可以对每个用户和每个视图使用限制吗?如果是的话,怎么做?

2 个答案:

答案 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设置使用请求“范围”中的键确定。

由于您未在任何视图中设置油门范围,因此ApiView1ApiView2都使用相同的油门作用域scope。因此,它们具有相同的限制。如果一个视图被过度访问,则另一个视图也不可接受。

在您的情况下,您应该在apiview中设置不同的油门_scope并将范围添加到REST_FRAMEWORK.DEFAULT_THROTTLE_RATES