Stack Python — InfoWhere
Template de stack para projetos Python
Última atualização: 25/01/2026
Nível de experiência: ⭐⭐⭐ Crescendo
1. Visão Geral
Stack para projetos de IA/ML, MCPs, automações e APIs rápidas.
2. Versões
| Componente | Versão | Notas |
|---|---|---|
| Python | 3.12.x | Última estável |
| FastAPI | 0.115.x | Framework principal para APIs |
| Pydantic | 2.x | Validação de dados |
| UV | Última | Gerenciador de pacotes (substitui pip) |
3. Dependências Core
3.1 API Framework
# pyproject.toml
[project]
dependencies = [
"fastapi>=0.115.0",
"uvicorn[standard]>=0.32.0",
"pydantic>=2.9.0",
"pydantic-settings>=2.6.0",
]
3.2 Database
[project.optional-dependencies]
db = [
"sqlalchemy>=2.0.0",
"asyncpg>=0.30.0", # PostgreSQL async
"alembic>=1.14.0", # Migrations
]
mongo = [
"motor>=3.6.0", # MongoDB async
"beanie>=1.27.0", # MongoDB ODM
]
3.3 Autenticação
auth = [
"python-jose[cryptography]>=3.3.0", # JWT
"passlib[bcrypt]>=1.7.4", # Password hashing
"httpx>=0.28.0", # HTTP client (Keycloak)
]
3.4 IA / LLM
ai = [
"langchain>=0.3.0",
"langchain-openai>=0.2.0",
"langchain-anthropic>=0.3.0",
"openai>=1.57.0",
"anthropic>=0.40.0",
]
3.5 MCP (Model Context Protocol)
mcp = [
"mcp>=1.0.0",
"httpx>=0.28.0",
]
3.6 Utilitários
utils = [
"python-dotenv>=1.0.0",
"loguru>=0.7.0", # Logging melhorado
"rich>=13.9.0", # CLI bonito
"typer>=0.15.0", # CLI framework
]
4. Testes
[project.optional-dependencies]
test = [
"pytest>=8.3.0",
"pytest-asyncio>=0.24.0",
"pytest-cov>=6.0.0",
"httpx>=0.28.0", # TestClient
"faker>=33.0.0", # Dados fake
]
Cobertura mínima: 80%
5. Autenticação / Autorização
| Componente | Escolha |
|---|---|
| Identity Provider | Keycloak |
| Protocolo | OAuth2 + JWT |
| Lib | python-jose |
Configuração típica
from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from jose import jwt, JWTError
security = HTTPBearer()
async def get_current_user(
credentials: HTTPAuthorizationCredentials = Depends(security)
) -> dict:
token = credentials.credentials
try:
payload = jwt.decode(
token,
settings.jwt_public_key,
algorithms=["RS256"],
audience=settings.jwt_audience,
)
return payload
except JWTError:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid token"
)
6. Database
| Componente | Escolha | Notas |
|---|---|---|
| SQL | PostgreSQL | Neon.tech para cloud |
| NoSQL | MongoDB | Atlas para cloud |
| ORM SQL | SQLAlchemy 2.0 | Async |
| ODM Mongo | Beanie | Async |
| Migrations | Alembic | Para SQL |
Convenções
- Tabelas:
snake_caseplural (users,invoices) - Colunas:
snake_case(created_at,user_id) - Models:
PascalCasesingular (User,Invoice)
7. Estrutura do Projeto
Nível Script (PoCs, MCPs, automações)
{projeto}/
├── main.py # Tudo junto
├── requirements.txt # ou pyproject.toml
├── .env
└── README.md
Ou se precisar separar minimamente:
{projeto}/
├── main.py # Entry point
├── services.py # Lógica de negócio
├── schemas.py # Pydantic DTOs
├── pyproject.toml
└── README.md
Quando usar: PoCs, scripts, MCPs, projetos que não vão crescer.
Nível Médio (APIs que podem crescer)
{projeto}/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI app
│ ├── config.py # Settings (pydantic-settings)
│ ├── routers/ # Endpoints (controllers)
│ │ ├── __init__.py
│ │ └── users.py
│ ├── services/ # Lógica de negócio + acesso a dados
│ │ ├── __init__.py
│ │ └── user_service.py
│ ├── schemas/ # Pydantic DTOs
│ │ ├── __init__.py
│ │ └── user.py
│ ├── models/ # SQLAlchemy entities
│ │ ├── __init__.py
│ │ └── user.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── security.py
│ │ └── exceptions.py
│ └── db/
│ ├── __init__.py
│ └── session.py
├── tests/
│ ├── conftest.py
│ └── test_users.py
├── alembic/
├── pyproject.toml
├── Dockerfile
└── README.md
Quando usar: APIs que podem crescer, projetos com múltiplos endpoints.
Nota: Sem Facade, sem Repository separado — Service acessa ORM direto.
---
## 8. Padrões e Convenções
### 8.1 API REST
- Versionamento: `/api/v1/`
- Formato: JSON
- Naming: `snake_case` para URLs (`/api/v1/user_profiles`)
- Async: Sempre que possível
- Docs: Auto-gerado pelo FastAPI (`/docs`, `/redoc`)
### 8.2 Schemas (Pydantic)
```python
# Request
class UserCreate(BaseModel):
email: EmailStr
name: str
# Response
class UserResponse(BaseModel):
id: UUID
email: EmailStr
name: str
created_at: datetime
model_config = ConfigDict(from_attributes=True)
# Update (partial)
class UserUpdate(BaseModel):
email: EmailStr | None = None
name: str | None = None
8.3 Exceptions
# Custom exception
class ResourceNotFoundError(Exception):
def __init__(self, resource: str, id: str):
self.resource = resource
self.id = id
# Handler
@app.exception_handler(ResourceNotFoundError)
async def not_found_handler(request, exc):
return JSONResponse(
status_code=404,
content={"detail": f"{exc.resource} {exc.id} not found"}
)
8.4 Logs
- Framework: Loguru
- Formato: JSON em produção
from loguru import logger
logger.info("User created", user_id=user.id)
9. Infraestrutura
| Componente | Escolha |
|---|---|
| Containerização | Docker |
| Orquestração | Kubernetes |
| CI/CD | GitHub Actions |
| Registry | Docker Hub |
| Cloud DB | Neon.tech / MongoDB Atlas |
Dockerfile típico
FROM python:3.12-slim
WORKDIR /app
# Instalar UV
RUN pip install uv
# Copiar dependências
COPY pyproject.toml .
RUN uv pip install --system -e ".[all]"
# Copiar código
COPY src/ src/
EXPOSE 8000
CMD ["uvicorn", "src.{projeto}.main:app", "--host", "0.0.0.0", "--port", "8000"]
10. O que NÃO usar
| Tecnologia | Motivo |
|---|---|
| Flask | Preferir FastAPI (async, typing, docs) |
| pip | Preferir UV (mais rápido) |
| requests | Preferir httpx (async) |
| Django | Overkill para APIs, preferir FastAPI |
| Python < 3.12 | Sempre versão recente |
11. Checklist de Novo Projeto
- Criar projeto com
uv init - Configurar
pyproject.tomlcom dependências - Criar estrutura de pastas
- Configurar
config.pycom pydantic-settings - Configurar autenticação JWT/Keycloak
- Configurar Alembic (se SQL)
- Criar Dockerfile
- Criar docker-compose.yml para dev
- Configurar pytest com fixtures
- Criar README.md com instruções
12. Links de Referência
Nota: Este template é a base. Cada projeto pode ter ajustes específicos documentados no
technical_context.mddo projeto.