def get_usage_count(request, group=None, fn=None, key=None, rate=None, method=ALL, increment=False): if not key: raise ImproperlyConfigured('Ratelimit key must be specified') limit, period = _split_rate(rate) cache_name = getattr(settings, 'RATELIMIT_USE_CACHE', 'default') # TODO: Django 1.7+ cache = get_cache(cache_name) if callable(key): value = key(group, request) elif key in _SIMPLE_KEYS: value = _SIMPLE_KEYS[key](request) elif ':' in key: accessor, k = key.split(':', 1) if accessor not in _ACCESSOR_KEYS: raise ImproperlyConfigured('Unknown ratelimit key: %s' % key) value = _ACCESSOR_KEYS[accessor](request, k) elif '.' in key: mod, attr = key.rsplit('.', 1) keyfn = getattr(import_module(mod), attr) value = keyfn(group, request) else: raise ImproperlyConfigured( 'Could not understand ratelimit key: %s' % key) cache_key = _make_cache_key(group, rate, value, method) time_left = _get_window(value, period) - int(time.time()) initial_value = 1 if increment else 0 added = cache.add(cache_key, initial_value) if added: count = initial_value else: if increment: try: count = cache.incr(cache_key) except ValueError: count = initial_value else: count = cache.get(cache_key, initial_value) return {'count': count, 'limit': limit, 'time_left': time_left}
def is_ratelimited(request, group=None, fn=None, key=None, rate=None, method=ALL, increment=False): if not key: raise ImproperlyConfigured('Ratelimit key must be specified') if group is None: if hasattr(fn, '__self__'): parts = fn.__module__, fn.__self__.__class__.__name__, fn.__name__ else: parts = (fn.__module__, fn.__name__) group = '.'.join(parts) if not getattr(settings, 'RATELIMIT_ENABLE', True): request.limited = False return False if not _method_match(request, method): return False old_limited = getattr(request, 'limited', False) if callable(rate): rate = rate(group, request) if rate is None: request.limited = old_limited return False limit, period = _split_rate(rate) cache_name = getattr(settings, 'RATELIMIT_USE_CACHE', 'default') # TODO: Django 1.7+ cache = get_cache(cache_name) if callable(key): value = key(group, request) elif key in _SIMPLE_KEYS: value = _SIMPLE_KEYS[key](request) elif ':' in key: accessor, k = key.split(':', 1) if accessor not in _ACCESSOR_KEYS: raise ImproperlyConfigured('Unknown ratelimit key: %s' % key) value = _ACCESSOR_KEYS[accessor](request, k) elif '.' in key: mod, attr = key.rsplit('.', 1) keyfn = getattr(import_module(mod), attr) value = keyfn(group, request) else: raise ImproperlyConfigured( 'Could not understand ratelimit key: %s' % key) cache_key = _make_cache_key(group, rate, value, method) # print cache_key initial_value = 1 if increment else 0 added = cache.add(cache_key, initial_value) if added: count = initial_value else: if increment: count = cache.incr(cache_key) else: count = cache.get(cache_key) limited = count > limit if increment: request.limited = old_limited or limited return limited
def is_ratelimited(request, group=None, fn=None, key=None, rate=None, method=ALL, increment=False): if not key: raise ImproperlyConfigured('Ratelimit key must be specified') if group is None: if hasattr(fn, '__self__'): parts = fn.__module__, fn.__self__.__class__.__name__, fn.__name__ else: parts = (fn.__module__, fn.__name__) group = '.'.join(parts) if not getattr(settings, 'RATELIMIT_ENABLE', True): request.limited = False return False if not _method_match(request, method): return False old_limited = getattr(request, 'limited', False) if callable(rate): rate = rate(group, request) if rate is None: request.limited = old_limited return False limit, period = _split_rate(rate) cache_name = getattr(settings, 'RATELIMIT_USE_CACHE', 'default') # TODO: Django 1.7+ cache = get_cache(cache_name) if callable(key): value = key(group, request) elif key in _SIMPLE_KEYS: value = _SIMPLE_KEYS[key](request) elif ':' in key: accessor, k = key.split(':', 1) if accessor not in _ACCESSOR_KEYS: raise ImproperlyConfigured('Unknown ratelimit key: %s' % key) value = _ACCESSOR_KEYS[accessor](request, k) elif '.' in key: mod, attr = key.rsplit('.', 1) keyfn = getattr(import_module(mod), attr) value = keyfn(group, request) else: raise ImproperlyConfigured( 'Could not understand ratelimit key: %s' % key) cache_key = _make_cache_key(group, rate, value, method) initial_value = 1 if increment else 0 added = cache.add(cache_key, initial_value) if added: count = initial_value else: if increment: try: count = cache.incr(cache_key) except ValueError: count = 0 else: count = cache.get(cache_key) or 0 limited = count > limit if increment: request.limited = old_limited or limited return limited