Add support for denominators to throttle strings

Improved denominator string parser so you can for example write `1/30s` for 1 request every 30 seconds instead of being limited to throttling by to the closest time unit.
This commit is contained in:
awiebe 2023-08-25 16:25:37 -07:00 committed by GitHub
parent 40eccb0d6c
commit a84846c4ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -56,6 +56,8 @@ class SimpleRateThrottle(BaseThrottle):
class. The attribute is a string of the form 'number_of_requests/period'.
Period should be one of: ('s', 'sec', 'm', 'min', 'h', 'hour', 'd', 'day')
You may prefix period with a number. For example '1/30s' would be one
request every 30 seconds.
Previous request information used for throttling is stored in the cache.
"""
@ -103,7 +105,10 @@ class SimpleRateThrottle(BaseThrottle):
return (None, None)
num, period = rate.split('/')
num_requests = int(num)
duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[0]]
denominator_num = period[:-1]
denominator_num = int(denominator) if len(denominator_num)>0 else 1
duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[-1]]
duration *= denominator_num
return (num_requests, duration)
def allow_request(self, request, view):