mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-18 04:02:35 +03:00
Try regex based solution to handle long unit names
This commit is contained in:
parent
ce0fe7a7c6
commit
3dce5b782d
|
@ -2,6 +2,7 @@
|
||||||
Provides various throttling policies.
|
Provides various throttling policies.
|
||||||
"""
|
"""
|
||||||
import time
|
import time
|
||||||
|
import re
|
||||||
|
|
||||||
from django.core.cache import cache as default_cache
|
from django.core.cache import cache as default_cache
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
|
@ -9,6 +10,7 @@ from django.core.exceptions import ImproperlyConfigured
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class BaseThrottle:
|
class BaseThrottle:
|
||||||
"""
|
"""
|
||||||
Rate throttling of requests.
|
Rate throttling of requests.
|
||||||
|
@ -66,6 +68,7 @@ class SimpleRateThrottle(BaseThrottle):
|
||||||
cache_format = 'throttle_%(scope)s_%(ident)s'
|
cache_format = 'throttle_%(scope)s_%(ident)s'
|
||||||
scope = None
|
scope = None
|
||||||
THROTTLE_RATES = api_settings.DEFAULT_THROTTLE_RATES
|
THROTTLE_RATES = api_settings.DEFAULT_THROTTLE_RATES
|
||||||
|
_RATE_DENOMINATOR_REGEX= re.compile("^(\d*)(\D+)$")
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
if not getattr(self, 'rate', None):
|
if not getattr(self, 'rate', None):
|
||||||
|
@ -105,10 +108,16 @@ 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)
|
||||||
denominator_num = period[:-1]
|
|
||||||
denominator_num = int(denominator_num) if len(denominator_num) > 0 else 1
|
denominator = period[:-1]
|
||||||
duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[-1]]
|
m = re.search(self._RATE_DENOMINATOR_REGEX, denominator)
|
||||||
duration *= denominator_num
|
dg = m.groups()
|
||||||
|
|
||||||
|
dn= int(m[0]) if len(m[0])>0 else 1
|
||||||
|
du = m[1][0]
|
||||||
|
|
||||||
|
duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[du]
|
||||||
|
duration *= dn
|
||||||
return (num_requests, duration)
|
return (num_requests, duration)
|
||||||
|
|
||||||
def allow_request(self, request, view):
|
def allow_request(self, request, view):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user