Skip to content

Commit 3f17a0a

Browse files
Provide information about which specific rate limits were counted
1 parent e113045 commit 3f17a0a

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

django_ratelimit/decorators.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
from django_ratelimit import ALL, UNSAFE
77
from django_ratelimit.exceptions import Ratelimited
88
from django_ratelimit.core import is_ratelimited
9+
from django_ratelimit.logger import RatelimitLogger
910

1011

1112
__all__ = ['ratelimit']
1213

1314

14-
def ratelimit(group=None, key=None, rate=None, method=ALL, block=True):
15+
def ratelimit(group=None, key=None, rate=None, method=ALL, block=True,
16+
logger: RatelimitLogger = None):
1517
def decorator(fn):
1618
@wraps(fn)
1719
def _wrapped(request, *args, **kw):
@@ -20,6 +22,9 @@ def _wrapped(request, *args, **kw):
2022
key=key, rate=rate, method=method,
2123
increment=True)
2224
request.limited = ratelimited or old_limited
25+
if ratelimited and logger:
26+
logger.log_ratelimit(request=request, group=group,
27+
key=key, rate=rate, method=method)
2328
if ratelimited and block:
2429
cls = getattr(
2530
settings, 'RATELIMIT_EXCEPTION_CLASS', Ratelimited)

django_ratelimit/logger.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import logging
2+
3+
4+
class RatelimitLogger:
5+
6+
def __init__(self, name='', level=logging.WARNING,
7+
msg_format="Ratelimit: {route} {group} \
8+
{key} {rate} {method}"):
9+
self.logger_name = name
10+
self.msg_format = msg_format
11+
self.level = level
12+
13+
def log_ratelimit(self, request, group, key, rate,
14+
method) -> None:
15+
logging.getLogger(self.logger_name).log(
16+
level=self.level,
17+
msg=self.msg_format
18+
.format(route=request.resolver_match.route,
19+
group=group, key=key, rate=rate, method=method))

0 commit comments

Comments
 (0)