"""Quickstart example - minimal setup to get rate limiting working.""" from __future__ import annotations from contextlib import asynccontextmanager from fastapi import FastAPI, Request from fastapi.responses import JSONResponse from fastapi_traffic import ( MemoryBackend, RateLimitExceeded, RateLimiter, rate_limit, ) from fastapi_traffic.core.limiter import set_limiter # Step 1: Create a backend and limiter backend = MemoryBackend() limiter = RateLimiter(backend) @asynccontextmanager async def lifespan(app: FastAPI): """Lifespan context manager for startup/shutdown.""" await limiter.initialize() set_limiter(limiter) yield await limiter.close() app = FastAPI(title="Quickstart Example", lifespan=lifespan) # Step 2: Add exception handler for rate limit errors @app.exception_handler(RateLimitExceeded) async def rate_limit_handler(request: Request, exc: RateLimitExceeded) -> JSONResponse: return JSONResponse( status_code=429, content={"error": "Too many requests", "retry_after": exc.retry_after}, ) # Step 3: Apply rate limiting to endpoints @app.get("/") @rate_limit(10, 60) # 10 requests per minute async def hello(request: Request) -> dict[str, str]: return {"message": "Hello, World!"} @app.get("/api/data") @rate_limit(100, 60) # 100 requests per minute async def get_data(request: Request) -> dict[str, str]: return {"data": "Some important data"} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)