feat: add configuration loader for .env and JSON files

- Add ConfigLoader class for loading RateLimitConfig and GlobalConfig
- Support .env files with FASTAPI_TRAFFIC_* prefixed variables
- Support JSON configuration files with type validation
- Add convenience functions: load_rate_limit_config, load_global_config
- Add load_rate_limit_config_from_env, load_global_config_from_env
- Support custom environment variable prefixes
- Add comprehensive error handling with ConfigurationError
- Add 47 tests for configuration loading
- Add example 11_config_loader.py with 9 usage patterns
- Update examples/README.md with config loader documentation
- Update CHANGELOG.md with new feature
- Fix typo in limiter.py (errant 'fi' on line 4)
This commit is contained in:
2026-02-01 13:59:32 +00:00
parent 6c5584c6b4
commit fb23e3c7cf
8 changed files with 1665 additions and 24 deletions

View File

@@ -22,7 +22,7 @@ logger = logging.getLogger(__name__)
class RateLimiter:
"""Main rate limiter class that manages rate limiting logic."""
__slots__ = ("_config", "_backend", "_algorithms", "_initialized")
__slots__ = ("_algorithms", "_backend", "_config", "_initialized")
def __init__(
self,
@@ -96,15 +96,14 @@ class RateLimiter:
identifier: str | None = None,
) -> str:
"""Build the rate limit key for a request."""
if identifier:
client_id = identifier
else:
client_id = config.key_extractor(request)
client_id = identifier or config.key_extractor(request)
path = request.url.path
method = request.method
return f"{self._config.key_prefix}:{config.key_prefix}:{method}:{path}:{client_id}"
return (
f"{self._config.key_prefix}:{config.key_prefix}:{method}:{path}:{client_id}"
)
def _is_exempt(self, request: Request, config: RateLimitConfig) -> bool:
"""Check if the request is exempt from rate limiting."""
@@ -118,10 +117,7 @@ class RateLimiter:
if client_ip in self._config.exempt_ips:
return True
if request.url.path in self._config.exempt_paths:
return True
return False
return request.url.path in self._config.exempt_paths
async def check(
self,