如何在 django rest 框架中定义多个油门

kir*_*ril 7 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']
    }
}
Run Code Online (Sandbox Code Playgroud)

Dui*_*lio 13

这是可能的,但必须定义多个限制,每个时间单位一个。

  1. 首先,您在设置中定义您需要的所有限制,例如每分钟不超过 30 次,每天不超过 1000 次。
        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',
          }
        }
Run Code Online (Sandbox Code Playgroud)
  1. 您将 Throttling 类添加为UserRateThrottle您定义的范围的子类:
from rest_framework.throttling import UserRateThrottle

class UserMinThrottle(UserRateThrottle):
             scope = 'user_min'
Run Code Online (Sandbox Code Playgroud)
  1. 最后,在 APIView 上,您将具有您在上一步定义的限制的类设置为油门类。
class YourAPIView(APIView):
     throttle_classes = [
          UserMinThrottle,
          UserDayThrottle
     ]
Run Code Online (Sandbox Code Playgroud)


Lin*_*via 2

您无法获得 的费率列表UserRateThrottle

根据文档,您必须配置范围以允许多种速率。

在你的情况下,它将是:

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'
    }
}
Run Code Online (Sandbox Code Playgroud)