Я понял способ сделать это, расширив UserRateThrottle и добавив специальных пользователей в мой файл настроек.
Этот класс просто переопределяет метод allow_request
, добавив некоторые специальные логику, чтобы увидеть, если имена пользователей перечислены в OVERRIDE_THROTTLE_RATES
переменной:
class ExceptionalUserRateThrottle(UserRateThrottle):
def allow_request(self, request, view):
"""
Give special access to a few special accounts.
Mirrors code in super class with minor tweaks.
"""
if self.rate is None:
return True
self.key = self.get_cache_key(request, view)
if self.key is None:
return True
self.history = self.cache.get(self.key, [])
self.now = self.timer()
# Adjust if user has special privileges.
override_rate = settings.REST_FRAMEWORK['OVERRIDE_THROTTLE_RATES'].get(
request.user.username,
None,
)
if override_rate is not None:
self.num_requests, self.duration = self.parse_rate(override_rate)
# Drop any requests from the history which have now passed the
# throttle duration
while self.history and self.history[-1] <= self.now - self.duration:
self.history.pop()
if len(self.history) >= self.num_requests:
return self.throttle_failure()
return self.throttle_success()
Чтобы использовать это, просто установите ваш DEFAULT_THROTTLE_CLASS
к этому классу, а затем положить некоторые специальные пользователей в OVERRIDE_THROTTLE_RATES
примерно так:
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'cl.api.utils.ExceptionalUserRateThrottle',
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/hour',
},
'OVERRIDE_THROTTLE_RATES': {
'scout': '10000/hour',
'scout_test': '10000/hour',
},
Спасибо за ответ! Эта идея очень аккуратная и определенно что-то включить в DRF – RoccoLacatus
Я не пытался продвигать этот вверх по течению, но я был бы рад, если бы кто-то попытался попасть в основную базу кода. – mlissner
Для меня идеальным решением является группировка пользователей по группам на странице администрирования django и дросселирование этими группами. Попытка сделать гибрид между вашим кодом и этой идеей. Если я выясню, что что-то опубликует здесь – RoccoLacatus