📊 Capítulo 12: Middlewares & Exception Handlers
Especialização Backend com Python & FastAPI
🗺️ O Ciclo de Vida do Middleware ASGI
sequenceDiagram
autonumber
actor C as Cliente HTTP
participant M as Custom ASGI Middleware (Tempo de Execução)
participant E as ExceptionHandler (@app.exception_handler)
participant EP as Endpoint Controller
C->>M: Requisição HTTP Recebida (Início do Timer)
M->>EP: call_next(request)
alt Sucesso
EP-->>M: Retorna Response
M->>M: Injeta Header "X-Process-Time: 0.004s"
M-->>C: Envia HTTP Response com Headers
else Erro Não Tratado
EP-->>E: Dispara Exceção Customizada
E->>E: Formata JSON ProblemDetail Padronizado
E-->>C: Retorna HTTP 400/404/500 JSON
end
🎯 Slide 1: Criando Middlewares ASGI Customizados
import time
from fastapi import Request
@app.middleware("http")
async def add_process_time_and_log(request: Request, call_next):
start_time = time.perf_counter()
response = await call_next(request)
process_time = time.perf_counter() - start_time
response.headers["X-Process-Time"] = f"{process_time:.4f}s"
return response
- Executa lógica antes e depois de absolutamente qualquer requisição HTTP!
🎯 Slide 2: Middlewares Embutidos (CORS, GZip, TrustedHost)
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.gzip import GZipMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["https://minha-aplicacao.com"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.add_middleware(GZipMiddleware, minimum_size=1000) # Comprime JSONs grandes
🎯 Slide 3: Exception Handlers Globais Padronizados
@app.exception_handler(EntidadeNaoEncontradaException)
async def not_found_handler(request: Request, exc: EntidadeNaoEncontradaException):
return JSONResponse(
status_code=status.HTTP_404_NOT_FOUND,
content={
"erro": "Recurso não encontrado",
"mensagem": str(exc),
"path": request.url.path
}
)
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim