Este site usa cookies e tecnologias afins que nos ajudam a oferecer uma melhor experiência. Ao clicar no botão "Aceitar" ou continuar sua navegação você concorda com o uso de cookies.

Aceitar
FastAPI: Validação de Dados com Pydantic (Guia Prático) – Segurança e Qualidade

fastapi

FastAPI: Validação de Dados com Pydantic (Guia Prático) – Segurança e Qualidade

Elias
Escrito por Elias

A validação de dados é um dos pilares no desenvolvimento de APIs modernas, pois garante que apenas informações corretas, seguras e bem estruturadas cheguem ao backend. No ecossistema FastAPI, essa tarefa se torna eficiente e automática graças ao poder do Pydantic. Este guia reúne os principais conceitos, exemplos e boas práticas para você dominar a validação de dados com FastAPI e Pydantic.

Por que a Validação de Dados é Importante em APIs?

APIs expostas a usuários ou sistemas externos precisam estar preparadas para receber dados malformados, incompletos ou até mesmo maliciosos. A validação é a primeira barreira para:

  • Evitar falhas lógicas e comportamentos inesperados
  • Garantir a integridade do banco de dados e previsibilidade das operações
  • Proteger contra ataques, como injeção de comandos (injection) e corrupção de dados
  • Comunicar erros de forma clara ao cliente da API

Dica: A OWASP (Open Web Application Security Project) lista a validação insuficiente como uma das principais vulnerabilidades de APIs web. (OWASP API Security Top 10, 2023)

O que é o Pydantic e Como Ele Funciona?

Pydantic é uma biblioteca Python de validação e parsing de dados baseada em type hints. Seus principais diferenciais:

  • Permite definir modelos de dados usando classes Python que herdam de pydantic.BaseModel.
  • Faz validação automática de tipos, restrições e converte entradas para os tipos esperados.
  • Integra-se profundamente ao FastAPI, permitindo schemas automatizados e documentação.

Exemplo básico:

from pydantic import BaseModel

class User(BaseModel):
id: int
name: str
email: str

Quando dados chegam para a API, o Pydantic valida e converte cada campo de acordo com o tipo definido.

Principais Recursos do Pydantic

  • Validação de tipos embutidos: int, float, str, list, dict, etc.
  • Validadores customizados: Adicione lógica além dos tipos básicos usando @validator.
  • Conversão automática de dados: Strings representam números? O Pydantic converte quando possível.
  • Mensagens de erro automáticas e descritivas: Usuários e desenvolvedores entendem rapidamente o que precisa ser corrigido.
  • Modelos aninhados: Estruture e valide dados complexos com facilidade.
  • Parsing flexível: Aceita entrada via dict, JSON, etc.

Saiba mais: Veja detalhes sobre validadores customizados na documentação Pydantic.

Integração entre FastAPI e Pydantic

No FastAPI, o Pydantic libera todo seu potencial:

  • Defina schemas de dados para corpo da requisição, query, path e resposta diretamente no endpoint.
  • Documentação OpenAPI automática: modelos Pydantic geram schemas legíveis na Swagger UI.
  • Validação em todo ponto de entrada de dados: request body, parâmetros de rota ou query.

Exemplo oficial: Binding automático de request body

Implementando Validação de Dados em FastAPI com Pydantic

1. Configurando o Ambiente

Pré-requisitos: Python 3.7+ e pip instalado.

Instale FastAPI e dependências:

pip install fastapi[all]

Isso inclui o FastAPI, Pydantic e o servidor Uvicorn para rodar a aplicação.

Compatibilidade: O FastAPI estável (março/2024) usa Pydantic >=1.9.0, <3.0.0. Confira sempre as versões!

2. Criando Modelos de Dados com Pydantic

Defina os modelos herdando de BaseModel, usando type hints:

from pydantic import BaseModel, EmailStr, validator
from typing import Optional

class UserCreate(BaseModel):
name: str
email: EmailStr
password: str
age: Optional[int] = None # campo opcional

@validator('password')
def check_password(cls, v):
if len(v) < 8:
raise ValueError('Senha deve ter pelo menos 8 caracteres')
return v

  • Campos opcionais podem ser definidos com Optional ou valores padrão.
  • Validação customizada pode ser feita via métodos com o decorador @validator.

Saiba mais sobre obrigatoriedade de campos em Pydantic: Required and Optional Fields.

3. Validando Dados em Requests (Bodies de Requisição)

No FastAPI, você usa o modelo como tipo do parâmetro da rota:

from fastapi import FastAPI

app = FastAPI()

@app.post("/users/")
def create_user(user: UserCreate):
return user

Ao enviar dados inválidos (ex: email malformado ou senha curta), o FastAPI responde automaticamente com HTTP 422 e uma mensagem estruturada indicando o erro:

{
"detail": [
{
"loc": ["body", "password"],
"msg": "Senha deve ter pelo menos 8 caracteres",
"type": "value_error"
}
]
}

Comportamento padrão documentado em FastAPI: Handling Errors

4. Validação em Parâmetros de Query e Path

É possível validar parâmetros de rota e query diretamente usando tipos e ferramentas do FastAPI:

from fastapi import Query, Path

@app.get("/items/{item_id}")
def get_item(
item_id: int = Path(..., ge=1, description="ID deve ser >= 1"),
q: Optional[str] = Query(None, min_length=3, max_length=50, description="Consulta entre 3 e 50 letras")
):
return {"item_id": item_id, "q": q}

Erros de validação (ex: ID negativo ou string curta) são informados de maneira clara nos detalhes do erro.

Saiba mais em FastAPI: Query Parameters and Validations

5. Mensagens de Erro e Tratamento de Falhas de Validação

O FastAPI já retorna mensagens de erro detalhadas. Para personalizar, você pode criar exception handlers:

from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from fastapi import status

@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
return JSONResponse(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
content={"error": "Erro de validação personalizado", "details": exc.errors()},
)

Veja mais exemplos na documentação oficial.

Boas Práticas ao Utilizar Pydantic e FastAPI

  • Use nomes claros para os modelos: UserCreate, UserResponse, etc.
  • Aproveite os modelos aninhados para estruturar dados complexos.
  • Separe modelos de entrada e saída para evitar expor dados sensíveis (como senhas ou tokens).
  • Utilize sempre as validações automáticas do Pydantic – evite validação manual duplicada.
  • Documente e use exemplos nos modelos para melhorar a experiência na API.

Separar modelos para request e response é uma recomendação para evitar vazamento de informações na resposta. Saiba mais: FastAPI: Response Model

Exemplos Práticos de Uso

Vamos simular parte de uma API de usuários, incluindo validações:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, EmailStr, validator
from typing import Optional

app = FastAPI()

class UserCreate(BaseModel):
name: str
email: EmailStr
password: str
age: Optional[int] = None

@validator('password')
def strong_password(cls, v):
if len(v) < 8:
raise ValueError('A senha precisa de pelo menos 8 caracteres')
return v

@app.post("/users/")
def create_user(user: UserCreate):
# Simulação de erro para e-mails já existentes
if user.email == "jaexiste@email.com":
raise HTTPException(status_code=400, detail="E-mail já cadastrado")
return {"message": "Usuário criado!", "user": user}

Teste entradas válidas e inválidas na documentação Swagger UI automática.


Comparativo: Pydantic vs Outros Frameworks de Validação em Python

  • Pydantic: Baseado em type hints (Pythonic), integração total ao FastAPI, validação rápida e clara, forte tipagem automática.
  • Marshmallow: Popular em projetos Flask, usa schemas declarativos e serialização/deserialização, tipagem não obrigatória.
  • Cerberus: Foco em validação pura de dicionários, mais flexível mas menos acoplado a frameworks modernos.

Pydantic se destaca em integração com FastAPI e suporte a typing moderno, sendo a escolha natural para APIs rápidas e tipadas.

Validações Avançadas: Casos Complexos

  • Validação entre campos: Use validadores de classe (@validator(..., pre=True, always=True)) para garantir dependências condicionais. Exemplo: se um campo é obrigatório apenas quando outro tiver certo valor.
  • Dados sensíveis: Nunca armazene senhas em texto puro! Faça hashing antes de persistir dados no banco.
  • Integração com autenticação/autorização: Após validar dados, integre rapidamente com módulos de autenticação, conforme detalhado no artigo FastAPI: Autenticação e Autorização – Guia Seguro de APIs Python.

Conclusão

A validação automática de dados usando Pydantic e FastAPI eleva o padrão de qualidade e segurança das suas APIs. Com modelos claros, validação automática e mensagens de erro bem definidas, o desenvolvimento é muito mais produtivo e confiável. Siga as práticas recomendadas, customize quando necessário e abuse da documentação automática para entregar APIs robustas e fáceis de usar.


Pronto para Aplicar a Validação de Dados no Seu Projeto FastAPI?

Agora que você já domina os conceitos, instale o FastAPI, crie seus primeiros modelos e explore o poder das validações automáticas! Experimente as dicas deste artigo, consulte a documentação oficial do FastAPI sempre que surgir dúvida e avance seus projetos para o próximo nível de segurança e qualidade.

Se quiser dar o próximo passo e aprender a criar uma API do zero, confira o artigo Como Criar Sua Primeira API com FastAPI: Tutorial para Iniciantes.