Tweak throttles and improve docs

This commit is contained in:
Tom Christie 2012-09-14 08:54:58 +01:00
parent 3005079824
commit 886f8b4751
3 changed files with 30 additions and 6 deletions

View File

@ -14,10 +14,12 @@ from djangorestframework.response import Response
class User3SecRateThrottle(UserRateThrottle): class User3SecRateThrottle(UserRateThrottle):
rate = '3/sec' rate = '3/sec'
scope = 'seconds'
class User3MinRateThrottle(UserRateThrottle): class User3MinRateThrottle(UserRateThrottle):
rate = '3/min' rate = '3/min'
scope = 'minutes'
class MockView(APIView): class MockView(APIView):

View File

@ -44,7 +44,7 @@ class SimpleRateThottle(BaseThrottle):
timer = time.time timer = time.time
settings = api_settings settings = api_settings
cache_format = '%(class)s_%(scope)s_%(ident)s' cache_format = 'throtte_%(scope)s_%(ident)s'
scope = None scope = None
def __init__(self, view): def __init__(self, view):
@ -144,7 +144,6 @@ class AnonRateThrottle(SimpleRateThottle):
ident = request.META.get('REMOTE_ADDR', None) ident = request.META.get('REMOTE_ADDR', None)
return self.cache_format % { return self.cache_format % {
'class': self.__class__.__name__,
'scope': self.scope, 'scope': self.scope,
'ident': ident 'ident': ident
} }
@ -167,7 +166,6 @@ class UserRateThrottle(SimpleRateThottle):
ident = request.META.get('REMOTE_ADDR', None) ident = request.META.get('REMOTE_ADDR', None)
return self.cache_format % { return self.cache_format % {
'class': self.__class__.__name__,
'scope': self.scope, 'scope': self.scope,
'ident': ident 'ident': ident
} }
@ -181,11 +179,13 @@ class ScopedRateThrottle(SimpleRateThottle):
user id of the request, and the scope of the view being accessed. user id of the request, and the scope of the view being accessed.
""" """
scope_attr = 'throttle_scope'
def __init__(self, view): def __init__(self, view):
""" """
Scope is determined from the view being accessed. Scope is determined from the view being accessed.
""" """
self.scope = getattr(self.view, 'throttle_scope', None) self.scope = getattr(self.view, self.scope_attr, None)
super(ScopedRateThrottle, self).__init__(view) super(ScopedRateThrottle, self).__init__(view)
def parse_rate_description(self, rate): def parse_rate_description(self, rate):
@ -204,7 +204,7 @@ class ScopedRateThrottle(SimpleRateThottle):
with the '.throttle_scope` property of the view. with the '.throttle_scope` property of the view.
""" """
if not self.scope: if not self.scope:
return None # Only throttle views with `.throttle_scope` set. return None # Only throttle views if `.throttle_scope` is set.
if request.user.is_authenticated(): if request.user.is_authenticated():
ident = request.user.id ident = request.user.id
@ -212,7 +212,6 @@ class ScopedRateThrottle(SimpleRateThottle):
ident = request.META.get('REMOTE_ADDR', None) ident = request.META.get('REMOTE_ADDR', None)
return self.cache_format % { return self.cache_format % {
'class': self.__class__.__name__,
'scope': self.scope, 'scope': self.scope,
'ident': ident 'ident': ident
} }

View File

@ -83,6 +83,29 @@ The allowed request rate is determined from one of the following (in order of pr
* The `rate` property on the class, which may be provided by overriding `UserThrottle` and setting the property. * The `rate` property on the class, which may be provided by overriding `UserThrottle` and setting the property.
* The `DEFAULT_THROTTLE_RATES['user']` setting. * The `DEFAULT_THROTTLE_RATES['user']` setting.
An API may have multiple `UserRateThrottles` in place at the same time. To do so, override `UserRateThrottle` and set a unique "scope" for each class.
For example, multiple user throttle rates could be implemented by using the following classes...
class BurstRateThrottle(UserRateThrottle):
scope = 'burst'
class SustainedRateThrottle(UserRateThrottle):
scope = 'sustained'
...and the following settings.
API_SETTINGS = {
'DEFAULT_THROTTLES': (
'example.throttles.BurstRateThrottle',
'example.throttles.SustainedRateThrottle',
)
'DEFAULT_THROTTLE_RATES': {
'burst': '60/min',
'sustained': '1000/day'
}
}
`UserThrottle` is suitable if you want a simple global rate restriction per-user. `UserThrottle` is suitable if you want a simple global rate restriction per-user.
## ScopedRateThrottle ## ScopedRateThrottle