From 5a898fa1c5e2a0370e5ea21e827bb10f22894fb3 Mon Sep 17 00:00:00 2001 From: lomadapraveenreddy Date: Fri, 12 Jul 2024 00:02:39 +0530 Subject: [PATCH] Provide information about which specific rate limits were counted --- django_ratelimit/decorators.py | 7 ++++++- django_ratelimit/logger.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 django_ratelimit/logger.py diff --git a/django_ratelimit/decorators.py b/django_ratelimit/decorators.py index 40c9541..c5697dc 100644 --- a/django_ratelimit/decorators.py +++ b/django_ratelimit/decorators.py @@ -6,12 +6,14 @@ from django_ratelimit import ALL, UNSAFE from django_ratelimit.exceptions import Ratelimited from django_ratelimit.core import is_ratelimited +from django_ratelimit.logger import RatelimitLogger __all__ = ['ratelimit'] -def ratelimit(group=None, key=None, rate=None, method=ALL, block=True): +def ratelimit(group=None, key=None, rate=None, method=ALL, block=True, + logger: RatelimitLogger = None): def decorator(fn): @wraps(fn) def _wrapped(request, *args, **kw): @@ -20,6 +22,9 @@ def _wrapped(request, *args, **kw): key=key, rate=rate, method=method, increment=True) request.limited = ratelimited or old_limited + if ratelimited and logger: + logger.log_ratelimit(request=request, group=group, + key=key, rate=rate, method=method) if ratelimited and block: cls = getattr( settings, 'RATELIMIT_EXCEPTION_CLASS', Ratelimited) diff --git a/django_ratelimit/logger.py b/django_ratelimit/logger.py new file mode 100644 index 0000000..249a9aa --- /dev/null +++ b/django_ratelimit/logger.py @@ -0,0 +1,19 @@ +import logging + + +class RatelimitLogger: + + def __init__(self, name='', level=logging.WARNING, + msg_format="Ratelimit: {route} {group} \ +{key} {rate} {method}"): + self.logger_name = name + self.msg_format = msg_format + self.level = level + + def log_ratelimit(self, request, group, key, rate, + method) -> None: + logging.getLogger(self.logger_name).log( + level=self.level, + msg=self.msg_format + .format(route=request.resolver_match.route, + group=group, key=key, rate=rate, method=method))