Backend amb Python i FastAPI — API modernes i escalables
FastAPI és el framework de referència de Python per a API REST asíncrones. Combina les anotacions de tipus natives de Python amb la validació automàtica de Pydantic, la documentació OpenAPI autogenerada i un rendiment ASGI comparable al de Node.js — sense sacrificar la llegibilitat del codi.
FastAPI — el framework de Python més ràpid
FastAPI s'executa sobre Uvicorn (servidor ASGI) amb Gunicorn per a multiprocés en producció. La Dependency Injection nativa permet provar de manera aïllada qualsevol capa sense mocks complexos: autenticació, sessió de base de dades, limitació de peticions — tot és una dependència injectable.
La documentació OpenAPI 3.1 es genera automàticament a partir de les anotacions de tipus — Swagger UI i ReDoc disponibles a `/docs` i `/redoc` en desenvolupament. L'esquema de Pydantic v2 (validador escrit en Rust) valida peticions i respostes entre 10 i 20 vegades més ràpid que Pydantic v1. Qualsevol camp invàlid retorna un 422 amb missatges d'error clars i localitzats.
- async/await natiu — E/S no bloquejant en totes les operacions de BD i HTTP
- BackgroundTasks per a operacions posteriors a la resposta (correu, webhook, registre)
- Compatibilitat nativa amb WebSocket per a funcionalitats en temps real (xat, notificacions)
- Limitació de peticions amb slowapi (basada en límits) — per IP i per usuari
- CORS, compressió (gzip/brotli), request ID, middleware de temps
PostgreSQL, SQLAlchemy i Alembic
Fem servir SQLAlchemy 2.0 asíncron (controlador asyncpg) per a totes les operacions de BD. Els models es defineixen amb tipus Mapped — segurs pel que fa als tipus, sense cadenes. Les consultes complexes s'escriuen amb SQLAlchemy Core (verificat en temps de compilació) o amb SQL pur mitjançant `text()` amb paràmetres enllaçats — mai interpolació de cadenes (prevenció completa d'SQLi).
Les migracions d'Alembic es generen automàticament a partir dels canvis als models i es revisen manualment abans d'aplicar-les. Cada migració té `upgrade()` i `downgrade()` provats. En producció, les migracions s'executen a la CI abans del desplegament — la base de dades sempre està sincronitzada amb el codi. Agrupació de connexions via asyncpg amb mida de pool configurable per servei.
- Bloqueig a nivell de fila amb `SELECT ... FOR UPDATE` per a operacions concurrents crítiques
- Cerca de text complet amb pg_trgm i tsvector — sense Elasticsearch per als casos senzills
- JSONB per a dades semiestructurades amb indexació GIN
- Taules particionades per a taules amb milions de files (registres, esdeveniments)
Memòria cau amb Redis i escalabilitat horitzontal
Redis 7 s'utilitza per a la memòria cau de l'aplicació (TTL per endpoint), l'emmagatzematge de sessions (tokens de refresc JWT amb revocació selectiva), pub/sub per a esdeveniments en temps real i cues per a tasques en segon pla (Celery o ARQ). L'estratègia de memòria cau és cache-aside amb invalidació explícita — no pas un TTL cec que pot servir dades obsoletes.
- Autenticació JWT amb token d'accés (15 min) + token de refresc a Redis (7 dies)
- Celery + broker Redis per a tasques asíncrones (generació de PDF, correu, importacions)
- Endpoint de comprovació d'estat `/health` amb l'estat de la BD i de Redis i la versió desplegada
- Registre JSON estructurat (structlog) — compatible amb Loki/Datadog/ELK
Avantatges i limitacions
Avantatges
- Rendiment ASGI comparable al de Node.js i Go en E/S.
- Documentació OpenAPI autogenerada a partir de les anotacions de tipus.
- Validació ràpida amb Pydantic v2, amb errors 422 clars.
- Codi llegible, Python és familiar per a la majoria d'equips.
Limitacions
- Python continua sent més lent que Go o Rust en tasques intensives de CPU.
- async/await exigeix disciplina — una sola crida bloquejant atura tot el bucle d'esdeveniments.
- Ecosistema més jove que Django en funcionalitats incloses de sèrie.
- No inclou ORM ni administració — es trien per separat.
Veredicte ràpid
Tria FastAPI per a API REST asíncrones, microserveis i backends per a SPA/mòbil. Per a aplicacions amb una càrrega de CPU extrema o monòlits amb una administració ja feta, Go o Django, respectivament, poden encaixar millor.
Taula d'especificacions
| Capacitat | Límit / llindar | Ús típic | |
|---|---|---|---|
| Concurrència | async/await, E/S no bloquejant | Les tasques intensives de CPU necessiten workers separats | API amb moltes crides a BD/HTTP |
| Latència | < 5ms per endpoint amb memòria cau de Redis | Augmenta amb la serialització de càrregues grans | SaaS, mòbil, backend en temps real |
| Validació i documentació | Pydantic v2 + OpenAPI 3.1 automàtic | Els esquemes complexos augmenten el temps d'arrencada | API públiques amb Swagger/ReDoc |
| Cost típic | Codi obert, funciona amb 1 vCPU | L'escalat horitzontal necessita més processos | Des d'un MVP fins a producció |
FastAPI davant les alternatives
| Criteri | FastAPI | Django / Express |
|---|---|---|
| Rendiment asíncron | Excel·lent (ASGI natiu) | Django parcial, Express bo |
| Documentació OpenAPI automàtica | Sí, a partir de les anotacions de tipus | Necessita paquets addicionals |
| Administració / ORM integrats | No (es trien per separat) | Django: sí; Express: no |
Preguntes freqüents
FastAPI és més ràpid que Django?
Sí en E/S. FastAPI funciona de manera asíncrona sobre ASGI, de manera que gestiona moltes més peticions concurrents amb crides a BD/HTTP que el Django clàssic síncron. Django, però, té més funcionalitats integrades.
Per a què no és adequat FastAPI?
Per a tasques amb una càrrega de CPU molt elevada (processament d'imatges, càlcul numèric intensiu) Python és més lent que Go o Rust; aquestes tasques es mouen a workers separats. Tampoc no té una administració ja feta com Django.
FastAPI necessita un ORM?
No és obligatori. Fem servir SQLAlchemy 2.0 asíncron amb Alembic per a les migracions, però es pot escriure SQL pur. L'ORM no ve inclòs, de manera que es tria per a cada projecte.
Com s'escala un backend FastAPI?
Horitzontalment: s'executen diversos processos d'Uvicorn sota Gunicorn darrere d'un equilibrador de càrrega, amb memòria cau de Redis i les tasques pesades mogudes a Celery. El disseny sense estat permet afegir instàncies segons la demanda.