Parabéns por chegar até aqui! Nesta última etapa, você vai aprender a organizar seu código de forma profissional, preparando sua aplicação para crescer.
Aprender a:
- Separar código em múltiplos arquivos
- Usar
APIRouterpara organizar rotas - Estruturar projetos FastAPI escaláveis
- Organizar a documentação com tags
Até agora, todo o código estava em um único arquivo main.py. Isso funciona para tutoriais e projetos pequenos, mas fica difícil de manter quando a aplicação cresce.
Problemas de ter tudo em um arquivo:
- Difícil encontrar código específico
- Arquivo muito longo e difícil de navegar
- Difícil trabalhar em equipe (conflitos de merge)
- Difícil testar partes específicas
APIRouter permite criar grupos de rotas que podem ser organizados em arquivos separados:
from fastapi import APIRouter
router = APIRouter(
prefix="/livros", # Todas as rotas começam com /livros
tags=["livros"] # Agrupa na documentação
)
@router.get("/") # Se torna /livros/
def listar_livros():
...05-organizando-codigo/
├── main.py # Configuração principal e rotas raiz
├── models.py # Modelos Pydantic (validação)
└── routers.py # Rotas organizadas por recurso
Contém todos os modelos Pydantic:
Livro- Modelo de livro com validaçõesAutor- Modelo de autorRespostaPadrao- Modelo de resposta
Por que separar:
- Modelos podem ser reutilizados em múltiplos routers
- Facilita encontrar e modificar estruturas de dados
- Permite testar validações independentemente
Contém dois routers:
router_livros- Todas as operações com livrosrouter_autores- Todas as operações com autores
Cada router tem CRUD completo:
- GET (listar e obter)
- POST (criar)
- PUT (atualizar)
- DELETE (remover)
Por que separar:
- Cada recurso tem seu próprio conjunto de rotas
- Fácil adicionar novos recursos sem afetar existentes
- Código relacionado fica junto
Arquivo principal que:
- Cria a aplicação FastAPI
- Define configurações globais
- Inclui os routers
- Define rotas únicas (como raiz)
Por que manter:
- Ponto de entrada único da aplicação
- Configurações centralizadas
- Fácil ver todos os recursos disponíveis
uv run fastapi dev 05-organizando-codigo/main.pyAcesse: http://localhost:8000/docs
Observe a organização perfeita:
- 🏠 raiz - Rota principal
- 📚 livros - Todas as operações de livros agrupadas
- ✍️ autores - Todas as operações de autores agrupadas
- Cada grupo pode ser expandido/recolhido
- Navegação muito mais clara!
- Expanda a seção livros
- Clique em
POST /livros/ - "Try it out"
- Use este exemplo:
{ "titulo": "Python Fluente", "autor": "Luciano Ramalho", "ano": 2015, "paginas": 792 } - "Execute" → Sucesso! ✅
Crie mais livros:
- "Fluent Python 2nd Edition" - Luciano Ramalho - 2022 - 1000 páginas
- "Python Cookbook" - David Beazley - 2013 - 706 páginas
No navegador: http://localhost:8000/livros/
Ou no /docs:
GET /livros/→ "Try it out" → "Execute"- Veja todos os livros que você criou!
No navegador: http://localhost:8000/livros/?disponivel=true
Ou no /docs:
GET /livros/→ "Try it out"- Marque o checkbox
disponivelcomotrue - "Execute" → Veja apenas livros disponíveis
No navegador: http://localhost:8000/livros/1
Ou no /docs:
GET /livros/{id}→ "Try it out"- Digite ID: 1
- "Execute"
PUT /livros/{id}→ "Try it out"- ID: 1
- Edite para 2ª edição:
{ "titulo": "Python Fluente - 2ª Edição", "autor": "Luciano Ramalho", "ano": 2022, "paginas": 1000 } - "Execute" → Atualizado! ✅
DELETE /livros/{id}→ "Try it out"- ID: 3
- "Execute" → Deletado! ✅
- Liste todos novamente - livro sumiu!
- Expanda a seção autores
POST /autores/→ "Try it out"- Use este exemplo:
{ "nome": "Luciano Ramalho", "email": "[email protected]", "biografia": "Programador Python há mais de 20 anos, palestrante e autor técnico" } - "Execute" → Criado! ✅
Crie mais autores:
- David Beazley - [email protected] - "Expert em Python e sistemas"
- Brett Slatkin - [email protected] - "Software Engineer no Google"
No navegador:
- http://localhost:8000/autores/ - Lista todos
- http://localhost:8000/autores/1 - Autor específico
Ou no /docs:
GET /autores/→ Veja todosGET /autores/{id}→ Veja um específico
Veja como é fácil navegar:
- Todas as rotas de livros estão juntas
- Todas as rotas de autores estão juntas
- Cada seção tem cor diferente
- Documentação clara e organizada
Imagine adicionar mais recursos (empréstimos, avaliações, etc.) - cada um teria sua própria seção!
1. Criar o router (routers.py):
router_livros = APIRouter(
prefix="/livros",
tags=["livros"]
)
@router_livros.get("/") # Rota final: /livros/
def listar_livros():
...
@router_livros.get("/{id}") # Rota final: /livros/{id}
def obter_livro(id: int):
...2. Incluir no app (main.py):
app.include_router(router_livros)Pronto! Todas as rotas do router estão disponíveis no app.
Tags organizam a documentação:
router_livros = APIRouter(tags=["livros"])
router_autores = APIRouter(tags=["autores"])No /docs, você verá seções separadas:
- livros - todas as rotas de livros
- autores - todas as rotas de autores
📁 projeto/
- main.py
- models.py
- routers.py
📁 projeto/
📁 routers/
- livros.py
- autores.py
- usuarios.py
📁 models/
- livros.py
- autores.py
- main.py
- database.py
📁 projeto/
📁 app/
📁 routers/
- __init__.py
- livros.py
- autores.py
📁 models/
- __init__.py
- livros.py
- autores.py
📁 schemas/
- livros.py
- autores.py
📁 database/
- connection.py
- crud.py
📁 core/
- config.py
- security.py
- main.py
📁 tests/
- test_livros.py
- test_autores.py
- requirements.txt
- README.md
-
Adicione um novo recurso "empréstimos":
router_emprestimos = APIRouter( prefix="/emprestimos", tags=["empréstimos"] ) @router_emprestimos.post("/") def criar_emprestimo(livro_id: int, usuario: str): ...
- Inclua no app:
app.include_router(router_emprestimos) - Veja a nova seção aparecer no
/docs! - Teste criando empréstimos
- Inclua no app:
-
Separe os routers em arquivos:
📁 routers/ - livros.py # Move router_livros para cá - autores.py # Move router_autores para cá- Importe em main.py:
from routers.livros import router_livros - Documentação continua funcionando perfeitamente!
- Importe em main.py:
-
Adicione metadados às tags:
app = FastAPI( openapi_tags=[ {"name": "livros", "description": "Operações com livros"}, {"name": "autores", "description": "Gerenciamento de autores"}, ] )
- Veja as descrições aparecerem no
/docs
- Veja as descrições aparecerem no
-
Adicione parâmetros comuns:
@router_livros.get("/") def listar_livros( skip: int = 0, limit: int = 10, disponivel: bool = None ): ...
- Teste diferentes combinações de paginação no
/docs
- Teste diferentes combinações de paginação no
Você completou o tutorial básico! Agora você pode:
# SQLAlchemy para banco de dados
uv pip install sqlalchemy
# Alembic para migrations
uv pip install alembic# OAuth2 com JWT
uv pip install python-jose[cryptography] passlib[bcrypt]# pytest para testes
uv pip install pytest httpx- Railway (https://railway.app)
- Render (https://render.com)
- Fly.io (https://fly.io)
- AWS/GCP/Azure
- ✅ Código separado em múltiplos arquivos
- ✅ APIRouter para organizar rotas
- ✅ Tags para organizar documentação
- ✅ Estrutura escalável
- ✅ Separação clara de responsabilidades
- ✅ Pronto para crescer!
Você aprendeu os fundamentos do FastAPI:
- ✅ Criar rotas GET e POST
- ✅ Validar dados com Pydantic
- ✅ Usar documentação automática
- ✅ Organizar código profissionalmente
Agora você tem a base para construir suas próprias APIs!
Parabéns por completar o tutorial! 🎉
Se você gostou de FastAPI, considere:
- ⭐ Dar star no repositório do FastAPI
- 📖 Ler a documentação completa
- 🚀 Construir seu próprio projeto
- 🤝 Contribuir com a comunidade Python