2015-12-30 3 views
2

J'ai des utilisateurs qui ont besoin de très grandes manettes pour pouvoir utiliser beaucoup le système. Existe-t-il un moyen facile de leur donner des commandes plus élevées que le reste des utilisateurs? J'ai regardé autour de moi mais je n'ai rien trouvé.Django REST Framework: Accélérateurs par utilisateur

Répondre

7

J'ai trouvé un moyen de le faire en étendant le UserRateThrottle et en ajoutant des utilisateurs spéciaux à mon fichier de paramètres.

Cette classe l'emporte sur tout la méthode allow_request, en ajoutant une logique spéciale pour voir si les noms d'utilisateur sont répertoriés dans la variable 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() 

Pour l'utiliser, vient de mettre votre DEFAULT_THROTTLE_CLASS à cette classe, puis mettre un peu spécial utilisateurs dans OVERRIDE_THROTTLE_RATES comme si:

'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

Merci pour la réponse! Cette idée est vraiment soignée et certainement quelque chose à inclure dans DRF – RoccoLacatus

+0

Je n'ai pas essayé de pousser cela en amont, mais je serais ravi si quelqu'un essayait de l'intégrer dans la base de code principale. – mlissner

+0

Pour moi, la solution idéale devrait être de regrouper les utilisateurs par groupes dans la page d'administration de django et la limitation par ces groupes. Essayer de faire un hybride entre votre code et cette idée. Si je trouve quelque chose le postera ici – RoccoLacatus