Quickstart¶
Crie uma API funcional em 5 minutos.
Visão Geral da Arquitetura¶
flowchart TB
subgraph Client
REQ[HTTP Request]
end
subgraph "Stride"
MW[Middleware Stack]
RT[AutoRouter]
VS[ViewSet]
MD[Model]
DB[(Database)]
end
REQ --> MW
MW --> RT
RT --> VS
VS --> MD
MD --> DB
style MW fill:#e1f5fe
style VS fill:#fff3e0
style MD fill:#e8f5e9
Requisitos¶
- Python 3.12+
- PostgreSQL (ou SQLite para dev)
Instalação¶
# Instalação global (recomendado)
pipx install stride
# Ou por projeto
pip install stride
Criar Projeto¶
stride init my-api
cd my-api
Isso cria:
my-api/
├── src/
│ ├── settings.py # Configuração
│ ├── main.py # Entry point
│ └── apps/
│ ├── models.py # Imports de models
│ └── users/ # App de exemplo
├── migrations/
├── .env
└── pyproject.toml
Configurar¶
Edite src/settings.py:
from strider.config import Settings, configure
class AppSettings(Settings):
app_name: str = "Minha API"
# Auth - auto-configurado quando user_model definido
user_model: str = "src.apps.users.models.User"
models_module: str = "src.apps"
settings = configure(settings_class=AppSettings)
Edite .env:
DATABASE_URL=postgresql+asyncpg://user:pass@localhost/mydb
SECRET_KEY=change-me-in-production
DEBUG=true
Criar Model¶
# src/apps/posts/models.py
from strider import Model, Field
from sqlalchemy.orm import Mapped
class Post(Model):
__tablename__ = "posts"
id: Mapped[int] = Field.pk()
title: Mapped[str] = Field.string(max_length=200, index=True)
content: Mapped[str] = Field.text()
published: Mapped[bool] = Field.boolean(default=False)
Importe no arquivo barrel:
# src/apps/models.py
from src.apps.posts.models import Post # noqa
Criar ViewSet¶
# src/apps/posts/views.py
from strider import ModelViewSet
from strider.permissions import AllowAny
from .models import Post
class PostViewSet(ModelViewSet):
model = Post
permission_classes = [AllowAny] # Acesso público
Criar URLs¶
# src/apps/posts/urls.py
from strider import path
from .views import PostViewSet
urlpatterns = [
path("posts", PostViewSet),
]
Entry Point¶
# src/main.py
from strider import StrideApp
app = StrideApp() # Auto-discovery carrega tudo automaticamente
O framework automaticamente:
- Carrega settings do .env
- Descobre todas as apps em installed_apps
- Carrega URLs de cada urls.py
- Aplica middlewares configurados
- Cria tabelas (se auto_create_tables=True)
Executar¶
# Criar migration
stride makemigrations --name add_posts
# Aplicar migration
stride migrate
# Iniciar servidor
stride run
Testar¶
Abra http://localhost:8000/docs
Endpoints gerados:
| Método | Path | Ação |
|---|---|---|
| GET | /api/v1/posts/ | Listar |
| POST | /api/v1/posts/ | Criar |
| GET | /api/v1/posts/{id} | Obter um |
| PUT | /api/v1/posts/{id} | Atualizar |
| PATCH | /api/v1/posts/{id} | Atualização parcial |
| DELETE | /api/v1/posts/{id} | Deletar |
Exemplo com Auto-Configuração Completa¶
# src/settings.py
from strider.config import Settings, PydanticField, configure
class AppSettings(Settings):
# ══════════════════════════════════════════════════════════════════
# Aplicação
# ══════════════════════════════════════════════════════════════════
app_name: str = "Minha API"
# ══════════════════════════════════════════════════════════════════
# Auth (auto-configurado)
# ══════════════════════════════════════════════════════════════════
user_model: str = "src.apps.users.models.User"
models_module: str = "src.apps"
# ══════════════════════════════════════════════════════════════════
# Middleware
# ══════════════════════════════════════════════════════════════════
middleware: list[str] = [
"timing",
"request_id",
"auth",
]
# ══════════════════════════════════════════════════════════════════
# Campos customizados
# ══════════════════════════════════════════════════════════════════
stripe_key: str = PydanticField(default="", description="Stripe API Key")
# Configura TUDO automaticamente
settings = configure(settings_class=AppSettings)
Próximos passos¶
- Criar uma aplicação — Guia completo (config, DB, ViewSet, APIView, serializers, paginação, WebSocket, SSE, validação)
- Settings — Opções de configuração
- Models — Tipos de campos, relacionamentos
- ViewSets — Serializer, actions, hooks
- Serializers — Input/Output e fluxo de validação única
- Auth — Autenticação JWT