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:

  1. 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)

  1. Salve o arquivo como: Atividade_12_1_SeuNome
  2. 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:

  1. Registrar exception handler para capturar RecursoNaoEncontradoException e formatar resposta JSON padronizada.

Resultado Esperado

Erro capturado globalmente retornando status 404 estruturado.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_12_2_SeuNome
  2. 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:

  1. Configurar CORSMiddleware restringindo 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)

  1. Salve o arquivo como: Atividade_12_3_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_12_4_SeuNome
  2. 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.")