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'. 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') 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. Previous request information used for throttling is stored in the cache.
""" """
@ -103,7 +105,10 @@ class SimpleRateThrottle(BaseThrottle):
return (None, None) return (None, None)
num, period = rate.split('/') num, period = rate.split('/')
num_requests = int(num) 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) return (num_requests, duration)
def allow_request(self, request, view): def allow_request(self, request, view):