@ -300,7 +300,6 @@ class RateLimitMiddleware:
self . get_response = get_response
self . get_response = get_response
self . anon_threshold , self . anon_window = _parse_rate ( settings . RATE_LIMITER_RATE )
self . anon_threshold , self . anon_window = _parse_rate ( settings . RATE_LIMITER_RATE )
self . auth_threshold , self . auth_window = _parse_rate ( settings . RATE_LIMITER_RATE_AUTHENTICATED )
self . auth_threshold , self . auth_window = _parse_rate ( settings . RATE_LIMITER_RATE_AUTHENTICATED )
self . allowlist = set ( settings . RATE_LIMIT_ALLOWLIST_IPS )
self . _rl_cache = caches [ ' ratelimit ' ]
self . _rl_cache = caches [ ' ratelimit ' ]
self . not_found_threshold = settings . RATE_LIMIT_404_THRESHOLD
self . not_found_threshold = settings . RATE_LIMIT_404_THRESHOLD
self . _bypass_paths = [
self . _bypass_paths = [
@ -314,11 +313,10 @@ class RateLimitMiddleware:
self . api_block_seconds = getattr ( settings , ' API_RATE_LIMIT_BLOCK_SECONDS ' , 300 )
self . api_block_seconds = getattr ( settings , ' API_RATE_LIMIT_BLOCK_SECONDS ' , 300 )
self . api_same_origin_bypass = getattr ( settings , ' API_RATE_LIMIT_SAME_ORIGIN_BYPASS ' , True )
self . api_same_origin_bypass = getattr ( settings , ' API_RATE_LIMIT_SAME_ORIGIN_BYPASS ' , True )
logger . info (
logger . info (
' [RATELIMIT] anon= %s auth= %s bot= %s allowlist= %s bypass_paths= %s ' ,
' [RATELIMIT] anon= %s auth= %s bot= %s bypass_paths= %s ' ,
settings . RATE_LIMITER_RATE ,
settings . RATE_LIMITER_RATE ,
settings . RATE_LIMITER_RATE_AUTHENTICATED ,
settings . RATE_LIMITER_RATE_AUTHENTICATED ,
settings . RATE_LIMITER_RATE_BOT ,
settings . RATE_LIMITER_RATE_BOT ,
list ( self . allowlist ) or ' (none) ' ,
[ p . pattern for p in self . _bypass_paths ] or ' (none) ' ,
[ p . pattern for p in self . _bypass_paths ] or ' (none) ' ,
)
)
logger . info (
logger . info (
@ -450,9 +448,6 @@ class RateLimitMiddleware:
def _evaluate ( self , request ) :
def _evaluate ( self , request ) :
ip = get_client_ip ( request )
ip = get_client_ip ( request )
if ip in self . allowlist :
return { ' action ' : ' pass ' , ' ip ' : ip }
# Check 1: known bad UA (hardcoded Python list — substring match)
# Check 1: known bad UA (hardcoded Python list — substring match)
ua = request . META . get ( ' HTTP_USER_AGENT ' , ' ' )
ua = request . META . get ( ' HTTP_USER_AGENT ' , ' ' )
for fragment in BOT_UA_FRAGMENTS :
for fragment in BOT_UA_FRAGMENTS :
@ -533,8 +528,6 @@ class RateLimitMiddleware:
user = getattr ( request , ' user ' , None )
user = getattr ( request , ' user ' , None )
if user and user . is_authenticated :
if user and user . is_authenticated :
return
return
if ip in self . allowlist :
return
count = self . _incr_with_ttl ( RL_IP_404S . format ( ip = ip ) , ttl = self . anon_window )
count = self . _incr_with_ttl ( RL_IP_404S . format ( ip = ip ) , ttl = self . anon_window )
if count > = self . not_found_threshold :
if count > = self . not_found_threshold :
_set_block ( RL_IP_BLOCKED . format ( ip = ip ) , RL_INDEX_BLOCKED_IPS , self . BLOCK_TTL )
_set_block ( RL_IP_BLOCKED . format ( ip = ip ) , RL_INDEX_BLOCKED_IPS , self . BLOCK_TTL )