如何在Django Rest框架中定义多个油门

时间:2019-05-14 11:01:00

标签: django-rest-framework

django_Rest_framework状态的文档:

  

如果要同时施加突发节流率和持续节流率,也可以使用多个节气门。例如,您可能希望将用户限制为每分钟最多60个请求,每天最多1000个请求

但是,没有说明如何实现这种情况。

我已经尝试过类似的方法,但是没有用

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

3 个答案:

答案 0 :(得分:1)

有可能,但是有必要定义多个限制,每个时间单位一个。

  1. 首先,在设置中定义所需的所有限制,例如,每分钟不超过30,每天不超过1000。

    .drawer {
      background: green;
      position: fixed;
      z-index: 1;
      top: 0;
      bottom: 0;
      width: 150px;
      min-height: 100vh;
    }
    .drawer.left {
      left: 0;
    }
    .drawer.right {
      right: 0;
    }
    
  2. 使用您定义的范围将Throttling类添加为UserRateThrottle的子类:

    REST_FRAMEWORK = {
      'DEFAULT_THROTTLE_CLASSES': (
                'rest_framework.throttling.AnonRateThrottle',
          'rest_framework.throttling.UserRateThrottle'
      ),
      'DEFAULT_THROTTLE_RATES': {
          'anon': '100/day',
          'user_min': '30/minute',
          'user_day': '1000/day',
      }
    }
    
  3. 最后,在您设置为节流阀的APIView上,这些类将具有您在上一步中定义的限制。

    class UserMinThrottle(UserRateThrottle):
         scope = 'user_min'
    

答案 1 :(得分:0)

您没有UserRateThrottle的费率列表。

根据documentation,您必须配置一个范围以允许多个费率。

在您的情况下,它将是:

class BurstRateThrottle(UserRateThrottle):
    scope = 'burst'

class SustainedRateThrottle(UserRateThrottle):
    scope = 'sustained'

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'example.throttles.BurstRateThrottle',
        'example.throttles.SustainedRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'burst': '60/min',
        'sustained': '1000/day'
    }
}

答案 2 :(得分:0)

这是一个很好的问题,由于我只想对我的ViewSet的一个方法(在我的情况下为create / POST)应用多个节流阀,所以情况就更加复杂了。

因此,我首先想出了如何仅对ViewSets中的特定方法应用节流阀,然后发现了这篇文章:http://www.pedaldrivenprogramming.com/2017/05/throttling-django-rest-framwork-viewsets/

并且由于ViewSet继承了APIView,所以我做到了,所以我将添加 APIView throttle_classes列表

import myprojectname.throttles as throttles # throttles.py

class MyFooViewSet(viewsets.ViewSet):


# Only throttle specific methods
def get_throttles(self):
    if self.action in ['create']:
        # Apply these throttle classes 
        self.throttle_classes.append(throttles.FooThrottleBurst)
        self.throttle_classes.append(throttles.FooThrottleSustained)
        # ...

throttles.py 看起来像这样(没什么特别的,就像https://www.django-rest-framework.org/api-guide/throttling/#userratethrottle

from rest_framework.throttling import UserRateThrottle

class FooThrottleBurst(UserRateThrottle):
    scope = 'mynamespace.burst'

class FooThrottleSustained(UserRateThrottle):
    scope = 'pricereport.sustained'

这些费率当然是在settings.py中定义的:

# ... some example values
'mynamespace.burst':        '3/minute',
'mynamespace.sustained':    '5/hour',
# ...

与Postman进行测试后,我在一分钟内可以成功完成3个POST(4个明显受到限制)。等待约60秒并提出新请求后,应用了“持续的”节流规则(每小时5次),DRF向我返回了此消息:

{
    "detail": "Request was throttled. Expected available in 3538 seconds."
}

我不了解OP的情况,但我想分享我的方法