Spec Backend Com Python E Fastapi • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 02.1 — Schema de Validação com BaseModel e Field Constraints

Contexto: Schema de Validação com BaseModel e Field Constraints no contexto de Tipagem e Serialização com Pydantic v2.

Requisitos de Execução:

  1. Criar modelo Pydantic ProdutoSchema com validações de tamanho mínimo de nome, preço positivo e tags únicas.

Resultado Esperado

Produto válido serializado para JSON com sucesso.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_02_1_SeuNome
  2. Envie na tarefa: Atividade Cap 02 - Tipagem e Serialização com Pydantic v2
🔑 Gabarito de Código & Solução Comentada
# schemas.py
from pydantic import BaseModel, Field, field_validator
from typing import List

class ProdutoSchema(BaseModel):
    id: int = Field(..., gt=0)
    nome: str = Field(..., min_length=3, max_length=100)
    preco: float = Field(..., gt=0.0)
    tags: List[str] = Field(default_factory=list)

    @field_validator("tags")
    @classmethod
    def validar_tags_unicas(cls, v):
        if len(v) != len(set(v)): raise ValueError("Tags não podem ser duplicadas")
        return v

p = ProdutoSchema(id=1, nome="Teclado Mecânico", preco=350.0, tags=["hardware", "usb"])
print("Produto:", p.model_dump())

🔍 Nível 2: Prática

Problema 02.2 — Transformação e Serialização Customizada com field_serializer

Contexto: Transformação e Serialização Customizada com field_serializer no contexto de Tipagem e Serialização com Pydantic v2.

Requisitos de Execução:

  1. Implementar método @field_serializer para formatar preço como moeda brasileira (BRL) e mascarar emails.

Resultado Esperado

Preço formatado: 'R$ 1.250,00' | Email mascarado: 'a***e@tech.com'

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_02_2_SeuNome
  2. Envie na tarefa: Atividade Cap 02 - Tipagem e Serialização com Pydantic v2
🔑 Gabarito de Código & Solução Comentada
# serializers.py
from pydantic import BaseModel, field_serializer

class ClienteResponse(BaseModel):
    nome: str
    email: str
    saldo: float

    @field_serializer("email")
    def mascarar_email(self, email: str) -> str:
        partes = email.split("@")
        return f"{partes[0][0]}***{partes[0][-1]}@{partes[1]}"

c = ClienteResponse(nome="Alice", email="alice@tech.com", saldo=1250.0)
print(c.model_dump())

⚡ Nível 3: Integração

Problema 02.3 — Validação Cruzada Multi-campo com model_validator

Contexto: Validação Cruzada Multi-campo com model_validator no contexto de Tipagem e Serialização com Pydantic v2.

Requisitos de Execução:

  1. Criar validador de modelo model_validator(mode='after') que confira se a data_fim é estritamente posterior à data_inicio.

Resultado Esperado

Validação de intervalo de datas executada com sucesso.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_02_3_SeuNome
  2. Envie na tarefa: Atividade Cap 02 - Tipagem e Serialização com Pydantic v2
🔑 Gabarito de Código & Solução Comentada
# date_range_validator.py
from pydantic import BaseModel, model_validator
from datetime import date

class EventoSchema(BaseModel):
    nome: str
    data_inicio: date
    data_fim: date

    @model_validator(mode="after")
    def validar_intervalo_datas(self):
        if self.data_fim < self.data_inicio:
            raise ValueError("data_fim deve ser posterior a data_inicio")
        return self

ev = EventoSchema(nome="Conferência Tech", data_inicio=date(2026, 9, 1), data_fim=date(2026, 9, 3))
print("Evento Válido:", ev.nome)

🏆 Nível 4: Desafio Corporativo

Problema 02.4 — Imutabilidade e Configuração Estrita com ConfigDict

Contexto: Imutabilidade e Configuração Estrita com ConfigDict no contexto de Tipagem e Serialização com Pydantic v2.

Requisitos de Execução:

  1. Configurar Pydantic com frozen=True, extra='forbid' e str_strip_whitespace=True para segurança corporativa máxima.

Resultado Esperado

Imutabilidade validada: Alteração de atributo bloqueada com ValidationError.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_02_4_SeuNome
  2. Envie na tarefa: Atividade Cap 02 - Tipagem e Serialização com Pydantic v2
🔑 Gabarito de Código & Solução Comentada
# strict_settings.py
from pydantic import BaseModel, ConfigDict, ValidationError

class TokenPayload(BaseModel):
    model_config = ConfigDict(frozen=True, extra="forbid", str_strip_whitespace=True)
    sub: str
    role: str
    exp: int

t = TokenPayload(sub="user_42", role="ADMIN", exp=1780000000)
print("Token Congelado:", t.sub)