2015-12-30 5 views
2

У меня есть пользователи, которым нужны действительно большие дроссели, чтобы они могли использовать систему много. Есть ли простой способ дать им более высокие дроссели, чем остальные пользователи?Django REST Framework: для каждого пользователя дроссели

Я осмотрелся, но ничего не нашел.

ответ

7

Я понял способ сделать это, расширив 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', 
}, 
+0

Спасибо за ответ! Эта идея очень аккуратная и определенно что-то включить в DRF – RoccoLacatus

+0

Я не пытался продвигать этот вверх по течению, но я был бы рад, если бы кто-то попытался попасть в основную базу кода. – mlissner

+0

Для меня идеальным решением является группировка пользователей по группам на странице администрирования django и дросселирование этими группами. Попытка сделать гибрид между вашим кодом и этой идеей. Если я выясню, что что-то опубликует здесь – RoccoLacatus