Especialização em Backend com Python & FastAPI • Demonstrações Práticas Compiláveis


💻 Exemplo 1 — Path e Query Parameters com Validação

from typing import Optional
from fastapi import FastAPI, Path, Query

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(
    item_id: int = Path(..., ge=1, description="ID do item positivo"),
    q: Optional[str] = Query(None, min_length=3, max_length=50, description="Busca opcional"),
):
    return {"item_id": item_id, "filtro": q}

💻 Exemplo 2 — Body com Múltiplos Modelos e Headers Customizados

from typing import Optional
from fastapi import FastAPI, Body, Header, Cookie, HTTPException, status
from pydantic import BaseModel

app = FastAPI()

class ClienteRef(BaseModel):
    cliente_id: int
    nome: str

class ItemPedido(BaseModel):
    produto_id: int
    quantidade: int
    preco_unitario: float

@app.post("/pedidos", status_code=status.HTTP_201_CREATED)
async def criar_pedido(cliente: ClienteRef = Body(...), itens: list[ItemPedido] = Body(...)):
    total = sum(item.quantidade * item.preco_unitario for item in itens)
    return {"cliente": cliente.nome, "total": total, "qtd_itens": len(itens)}

@app.get("/tenant-info")
async def obter_tenant(
    x_tenant_id: str = Header(..., description="ID da organização"),
    session_id: Optional[str] = Cookie(None),
):
    if not x_tenant_id.startswith("corp_"):
        raise HTTPException(status_code=400, detail="Tenant ID inválido")
    return {"tenant": x_tenant_id, "session_active": session_id is not None}

💻 Exemplo 3 — Upload de Arquivo com Validação de Mime-Type e Tamanho

from fastapi import FastAPI, UploadFile, File, HTTPException

app = FastAPI()
MAX_FILE_SIZE = 5 * 1024 * 1024  # 5 MB

@app.post("/upload-documento")
async def upload_documento(arquivo: UploadFile = File(...)):
    if arquivo.content_type not in {"application/pdf", "image/png"}:
        raise HTTPException(status_code=415, detail="Tipo de mídia não suportado")
    conteudo = await arquivo.read()
    if len(conteudo) > MAX_FILE_SIZE:
        raise HTTPException(status_code=413, detail="Arquivo excede o limite de 5MB")
    return {"filename": arquivo.filename, "tamanho_bytes": len(conteudo)}