🧩 Exercícios: Middlewares e Tratamento Global de Exceções
Spec Backend Com Python E Fastapi • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 12.1 — Middleware de Tempo de Resposta com Cabeçalho X-Process-Time
Contexto: Middleware de Tempo de Resposta com Cabeçalho X-Process-Time no contexto de Middlewares e Tratamento Global de Exceções.
Requisitos de Execução:
- Criar middleware ASGI que calcule o tempo total de processamento da requisição e injete o header
X-Process-Time.
Resultado Esperado
Header 'X-Process-Time: 0.0024s' adicionado na resposta HTTP.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_12_1_SeuNome - Envie na tarefa:
Atividade Cap 12 - Middlewares e Tratamento Global de Exceções
🔑 Gabarito de Código & Solução Comentada
# process_time_middleware.py
from fastapi import FastAPI, Request
import time
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
inicio = time.perf_counter()
response = await call_next(request)
tempo_total = time.perf_counter() - inicio
response.headers["X-Process-Time"] = f"{tempo_total:.4f}s"
return response
🔍 Nível 2: Prática
Problema 12.2 — Handler Global de Exceções Customizadas
Contexto: Handler Global de Exceções Customizadas no contexto de Middlewares e Tratamento Global de Exceções.
Requisitos de Execução:
- Registrar exception handler para capturar
RecursoNaoEncontradoExceptione formatar resposta JSON padronizada.
Resultado Esperado
Erro capturado globalmente retornando status 404 estruturado.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_12_2_SeuNome - Envie na tarefa:
Atividade Cap 12 - Middlewares e Tratamento Global de Exceções
🔑 Gabarito de Código & Solução Comentada
# exception_handlers.py
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
class RecursoNaoEncontradoException(Exception):
def __init__(self, mensagem: str): self.mensagem = mensagem
app = FastAPI()
@app.exception_handler(RecursoNaoEncontradoException)
async def recurso_nao_encontrado_handler(request: Request, exc: RecursoNaoEncontradoException):
return JSONResponse(
status_code=404,
content={"erro": "RECURSO_NAO_ENCONTRADO", "detalhe": exc.mensagem}
)
⚡ Nível 3: Integração
Problema 12.3 — Configuração de Middleware CORS Seguro
Contexto: Configuração de Middleware CORS Seguro no contexto de Middlewares e Tratamento Global de Exceções.
Requisitos de Execução:
- Configurar
CORSMiddlewarerestringindo origens permitidas, métodos autorizados e headers expostos.
Resultado Esperado
CORS configurado para domínios autorizados com suporte a credenciais.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_12_3_SeuNome - Envie na tarefa:
Atividade Cap 12 - Middlewares e Tratamento Global de Exceções
🔑 Gabarito de Código & Solução Comentada
# cors_setup.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["https://meufrontend.com"],
allow_credentials=True,
allow_methods=["GET", "POST", "PUT", "DELETE"],
allow_headers=["*"],
)
print("Middleware CORS configurado.")
🏆 Nível 4: Desafio Corporativo
Problema 12.4 — Middleware de Rastreamento Distribuído com Correlation ID
Contexto: Middleware de Rastreamento Distribuído com Correlation ID no contexto de Middlewares e Tratamento Global de Exceções.
Requisitos de Execução:
- Criar middleware que extraia ou gere
X-Correlation-IDúnico e o propague nos logs e headers.
Resultado Esperado
Correlation ID 'c7b9e012-...' injetado para rastreamento de ponta a ponta.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_12_4_SeuNome - Envie na tarefa:
Atividade Cap 12 - Middlewares e Tratamento Global de Exceções
🔑 Gabarito de Código & Solução Comentada
# correlation_middleware.py
import uuid
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def correlation_id_middleware(request: Request, call_next):
corr_id = request.headers.get("X-Correlation-ID", str(uuid.uuid4()))
response = await call_next(request)
response.headers["X-Correlation-ID"] = corr_id
return response
print("Middleware de Correlation ID pronto.")