Agora vamos além de apenas ler dados! Nesta etapa você vai aprender a receber e processar dados enviados pelo cliente.
Aprender a:
- Criar rotas POST para receber dados
- Usar Pydantic para validar dados automaticamente
- Implementar operações CRUD (Create, Read, Update, Delete)
- Trabalhar com request body (corpo da requisição)
Cada método tem um propósito:
- GET - Ler/buscar dados (não modifica nada)
- POST - Criar novos recursos
- PUT - Atualizar recurso completo
- PATCH - Atualizar parte de um recurso
- DELETE - Remover um recurso
Pydantic é uma biblioteca Python que usa type hints para:
- Validar dados automaticamente
- Converter tipos quando possível
- Gerar documentação automática
- Fornecer mensagens de erro claras
from pydantic import BaseModel
class Tarefa(BaseModel):
titulo: str # Obrigatório
descricao: str # Obrigatório
concluida: bool = False # Opcional, padrão FalseEste modelo define a estrutura que esperamos receber. O FastAPI vai:
- Validar que
tituloedescricaosão strings - Validar que
concluidaé booleano - Usar
Falseseconcluidanão for enviado - Rejeitar requisições que não seguem essa estrutura
@app.post("/tarefas")
def criar_tarefa(tarefa: Tarefa):
# tarefa já vem validado!
nova_tarefa = tarefa.model_dump() # Converte para dict
# ... processa ...
return {"mensagem": "Criado!", "tarefa": nova_tarefa}Observe:
tarefa: Tarefa- FastAPI automaticamente valida o JSON recebido- Se os dados forem inválidos, FastAPI retorna erro 422 automaticamente
model_dump()converte o modelo Pydantic para dicionário Python
@app.put("/tarefas/{tarefa_id}")
def atualizar_tarefa(tarefa_id: int, tarefa_atualizada: Tarefa):
# Combina path parameter (tarefa_id) com body (tarefa_atualizada)
...@app.delete("/tarefas/{tarefa_id}")
def deletar_tarefa(tarefa_id: int):
# Remove a tarefa da lista
...uv run fastapi dev 03-rotas-post/main.pyAcesse: http://localhost:8000/docs
Agora você verá rotas de todos os métodos HTTP: GET, POST, PUT e DELETE!
- Clique na rota
POST /tarefas(ela tem cor diferente, geralmente verde) - Clique em "Try it out"
- Você verá um JSON de exemplo. Edite-o:
{ "titulo": "Aprender FastAPI", "descricao": "Completar todas as etapas do tutorial", "concluida": false } - Clique em "Execute"
- Veja a resposta com status
201 Createde a tarefa criada com ID!
Crie mais tarefas:
- "Estudar Pydantic" - "Aprender validação de dados"
- "Fazer exercícios" - "Praticar o que aprendi"
No navegador: http://localhost:8000/tarefas
Ou no /docs:
- Expanda
GET /tarefas - "Try it out" → "Execute"
- Veja todas as tarefas que você criou!
No navegador: http://localhost:8000/tarefas/1
Ou no /docs:
- Expanda
GET /tarefas/{tarefa_id} - "Try it out"
- Digite o ID: 1
- "Execute"
- Veja apenas a tarefa com ID 1
- Expanda
PUT /tarefas/{tarefa_id}(geralmente cor laranja) - "Try it out"
- Digite o ID da tarefa que quer atualizar: 1
- Edite o JSON, marcando como concluída:
{ "titulo": "Aprender FastAPI", "descricao": "Completar todas as etapas do tutorial", "concluida": true } - "Execute"
- Veja a tarefa atualizada!
- Liste todas novamente para confirmar a mudança
- Expanda
DELETE /tarefas/{tarefa_id}(geralmente cor vermelha) - "Try it out"
- Digite o ID: 1
- "Execute"
- Veja a mensagem de sucesso
- Liste todas novamente - a tarefa sumiu!
O poder do Pydantic está na validação automática! Vamos testar no /docs:
- Vá em
POST /tarefas - "Try it out"
- Tente enviar:
{ "titulo": 123, "descricao": "teste" } - "Execute"
- Erro
422! O FastAPI diz quetitulodeve ser string!
- Tente enviar:
{ "titulo": "Só título" } - "Execute"
- Erro!
descricaoé obrigatório!
- Tente enviar:
{ "titulo": "Teste", "descricao": "Descrição", "concluida": "sim" } - "Execute"
- Erro!
concluidadeve sertrueoufalse, não uma string!
Observe: A validação acontece ANTES da sua função ser chamada. O Pydantic protege seu código! 🛡️
Faça esse exercício completo usando apenas o /docs:
-
Crie 3 tarefas:
- "Estudar Python" - "Revisar decoradores"
- "Ler documentação" - "FastAPI docs"
- "Fazer projeto" - "API de lista de tarefas"
-
Liste todas - Confirme que as 3 foram criadas
-
Marque a primeira como concluída:
- Use
PUT /tarefas/1 - Mude
concluidaparatrue
- Use
-
Obtenha apenas a tarefa 2:
- Use
GET /tarefas/2
- Use
-
Delete a tarefa 3:
- Use
DELETE /tarefas/3
- Use
-
Liste todas novamente - Devem sobrar apenas as tarefas 1 e 2
Observe: Toda essa interação aconteceu apenas clicando em botões no navegador! 🎉
-
Adicione um campo
prioridadeao modelo Tarefa:class Tarefa(BaseModel): titulo: str descricao: str concluida: bool = False prioridade: str = "média" # Nova!
- Crie uma tarefa com prioridade "alta"
- Veja o campo aparecer na documentação
-
Crie uma rota especial
PATCH /tarefas/{id}/concluir:@app.patch("/tarefas/{tarefa_id}/concluir") def marcar_concluida(tarefa_id: int): # Apenas marca como concluída, sem precisar enviar tudo ...
- Teste no
/docs- veja como é mais simples!
- Teste no
-
Adicione validação: título mínimo de 3 caracteres:
from pydantic import Field titulo: str = Field(min_length=3)
- Tente criar tarefa com título "ab"
- Veja o erro de validação no
/docs
-
Campo com valor padrão dinâmico:
from datetime import datetime data_criacao: datetime = Field(default_factory=datetime.now)
- Crie tarefas e veja a data/hora sendo preenchida automaticamente
- ✅ Rotas POST/PUT/DELETE além de GET
- ✅ Recebendo dados do cliente (request body)
- ✅ Validação automática com Pydantic
- ✅ Operações CRUD completas
- ✅ Mensagens de erro automáticas e claras
Na próxima etapa vamos explorar validações mais avançadas do Pydantic!