Claude-prime backend-fastapi-python
Use this skill for any Python backend work in this project: building FastAPI endpoints, writing service functions, defining Pydantic/SQLModel schemas, running Alembic migrations, or debugging 422 errors. Essential for authentication and authorization patterns — setting up get_current_user, is_superuser checks, admin-only guards, role-based access, and dependency injection chains like Depends(). Also covers middleware, background tasks, async SQLAlchemy sessions, ORM relationship loading, and request/response design. Activate whenever the question involves Python API code, FastAPI patterns, or backend architecture in this codebase. Not for frontend, Docker, CI/CD, or infrastructure.
git clone https://github.com/avibebuilder/claude-prime
T=$(mktemp -d) && git clone --depth=1 https://github.com/avibebuilder/claude-prime "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/starter-skills/backend-fastapi-python" ~/.claude/skills/avibebuilder-claude-prime-backend-fastapi-python && rm -rf "$T"
.claude/starter-skills/backend-fastapi-python/SKILL.mdBackend FastAPI Python
Project-specific conventions for FastAPI with SQLModel, pydantic-settings, and async SQLAlchemy.
Architecture Decisions
- Services are stateless functions — Not classes. First param is
.db: AsyncSession - Generic response wrapper — Always use
for consistency.ApiResponse[T] - Dependencies chain —
->get_current_user
->require_auth
.require_admin - Module-scoped config — Each module can have its own
.{module}_config.py - Error codes for frontend —
.AppException(status, message, error_code)
Gotchas
- SQLModel
fields are NOT included in API responses by default. You must explicitly add them toRelationship()
or use a separate response schema with those fields.model_config
does not load relationships. After commit, re-query withAsyncSession.refresh()
if you need related objects..options(selectinload(...))- Pydantic V2 uses
notmodel_validator
. Thevalidator
decorator is V1 and will break silently or raise deprecation warnings.@validator
in FastAPI creates a NEW instance per request — don't store state in dependency return values expecting it to persist.Depends()- Background tasks (
) run AFTER the response is sent. If they fail, the client already got a 200. Use proper task queues (Celery, ARQ) for anything that must not silently fail.BackgroundTasks - Alembic
misses: table renames (generates drop+create), index changes on existing columns, and--autogenerate
type modifications in PostgreSQL. Always review generated migrations.Enum
endpoints block the event loop if you call sync I/O inside them. Useasync def
for sync libraries or define the endpoint asrun_in_executor
(FastAPI runs sync endpoints in a threadpool).def
from FastAPI andHTTPException
from Starlette are different classes. Importing the wrong one causes middleware to miss exception handlers.HTTPException- SQLAlchemy's
on relationships causes N+1 queries in async sessions. Use explicitlazy="selectin"
in queries instead.selectinload()
in query params makes the field optional.Optional[str] = None
also works but loses type information — prefer the explicitstr = None
form.Optional- When using
, FastAPI filters OUT any fields not in the model. If your response is missing data, check that the response model includes all fields, not just the ORM model.response_model
References
| When you need... | Read |
|---|---|
| Directory layout | file-structure.md |
| Settings and env vars | configuration.md |
| Database sessions and connections | database.md |
| ORM models | models.md |
| Request/response schemas | schemas.md |
| Router and endpoint patterns | routing.md |
| Service layer patterns | services.md |
| Dependency injection | dependencies.md |
| Middleware setup | middleware.md |
| Error handling | error-handling.md |
| Auth flow example | auth.md |