Python- & FastAPI-backend — moderne, schaalbare API's
FastAPI is het Python-referentieframework voor asynchrone REST-API's. Het combineert native Python-type-hints met automatische Pydantic-validatie, zelf gegenereerde OpenAPI-documentatie en ASGI-prestaties op het niveau van Node.js — zonder de leesbaarheid van de code op te offeren.
FastAPI — het snelste Python-framework
FastAPI draait op Uvicorn (ASGI-server), in productie met Gunicorn voor multi-process-uitvoering. Een eenvoudig endpoint dat uit de Redis-cache leest, hoeft de database niet te raadplegen. De ingebouwde dependency injection maakt het mogelijk elke laag geïsoleerd te testen zonder omslachtige mocks: authenticatie, databasesessie, rate limiting — stuk voor stuk injecteerbare afhankelijkheden.
De OpenAPI 3.1-documentatie ontstaat automatisch uit de type-hints — Swagger UI en ReDoc staan tijdens de ontwikkeling klaar op `/docs` en `/redoc`. Het Pydantic v2-schema (validator in Rust) controleert requests en responses 10 tot 20 keer sneller dan Pydantic v1. Elk ongeldig veld levert een 422 op met duidelijke, gelokaliseerde foutmeldingen.
- Native async/await — niet-blokkerende I/O bij alle database- en HTTP-bewerkingen
- BackgroundTasks voor werk na de response (e-mail, webhook, log)
- Native WebSocket-ondersteuning voor realtimefuncties (chat, meldingen)
- Rate limiting met slowapi (op basis van limits) — per IP en per gebruiker
- Middleware voor CORS, compressie (gzip/brotli), request-ID en timing
PostgreSQL, SQLAlchemy en Alembic
Voor alle databasebewerkingen gebruiken we SQLAlchemy 2.0 async (asyncpg-driver). De modellen worden gedefinieerd met Mapped Types — typeveilig, zonder strings. Complexe queries schrijven we in SQLAlchemy Core (gecontroleerd op vertaaltijd) of als pure SQL via `text()` met gebonden parameters — nooit via string-interpolatie, waarmee SQL-injectie volledig is uitgesloten.
Alembic-migraties worden automatisch gegenereerd uit de modelwijzigingen en vóór toepassing handmatig nagekeken. Elke migratie heeft een geteste `upgrade()` en `downgrade()`. In productie draaien de migraties in de CI vóór de deployment — de database loopt daarmee altijd synchroon met de code. Connection pooling via asyncpg, met een per service instelbare poolgrootte.
- Row-level locking met `SELECT ... FOR UPDATE` voor kritieke parallelle bewerkingen
- Full-textzoeken met pg_trgm en tsvector — voor eenvoudige gevallen zonder Elasticsearch
- JSONB voor halfgestructureerde data met GIN-index
- Gepartitioneerde tabellen voor miljoenen rijen (logs, events)
Redis-caching en horizontaal schalen
Redis 7 fungeert als applicatiecache (TTL per endpoint), session store (JWT-refreshtokens met selectieve intrekking), pub/sub voor realtime-events en queue voor achtergrondtaken (Celery of ARQ). De cachingstrategie is cache-aside met expliciete invalidatie — geen blinde TTL die verouderde data zou kunnen uitleveren.
- JWT-authenticatie met accesstoken (15 min.) + refreshtoken in Redis (7 dagen)
- Celery met Redis als broker voor asynchrone taken (pdf-generatie, e-mail, imports)
- Health-check-endpoint `/health` met de status van database, Redis en deploymentversie
- Gestructureerde JSON-logging (structlog) — compatibel met Loki, Datadog en ELK
Voordelen en beperkingen
Voordelen
- ASGI-prestaties op het niveau van Node.js en Go bij I/O-belasting.
- OpenAPI-documentatie, automatisch gegenereerd uit de type-hints.
- Snelle Pydantic v2-validatie met duidelijke 422-fouten.
- Leesbare code; Python is voor de meeste teams vertrouwd.
Beperkingen
- Python blijft bij CPU-intensieve taken trager dan Go of Rust.
- async/await vraagt discipline — één blokkerende aanroep legt de hele event loop stil.
- Jonger ecosysteem dan Django als het om batteries-included-functies gaat.
- Levert geen ORM en geen adminomgeving mee — beide kies je apart.
Kort oordeel
Kies FastAPI voor asynchrone REST-API's, microservices en backends voor SPA- of mobiele applicaties. Voor extreem CPU-intensieve toepassingen respectievelijk monolieten met een kant-en-klaar adminpaneel kunnen Go dan wel Django beter passen.
Specificatietabel
| Mogelijkheid | Grens / drempel | Typisch gebruik | |
|---|---|---|---|
| Gelijktijdigheid | async/await, niet-blokkerende I/O | CPU-intensief werk vraagt aparte workers | API's met veel database- en HTTP-aanroepen |
| Latency | Redis-cache per endpoint, zonder databasebezoek | Loopt op met de serialisatie van grote payloads | SaaS-, mobiele en realtime backends |
| Validatie & documentatie | Pydantic v2 + automatische OpenAPI 3.1 | Complexe schema's verlengen de start | Publieke API's met Swagger/ReDoc |
| Typische kosten | Open source, draait op 1 vCPU | Horizontaal schalen vraagt meerdere processen | Van MVP tot productie |
FastAPI vergeleken met alternatieven
| Criterium | FastAPI | Django / Express |
|---|---|---|
| Async-prestaties | Uitstekend (native ASGI) | Django gedeeltelijk, Express goed |
| Automatische OpenAPI-documentatie | Ja, uit de type-hints | Vraagt extra pakketten |
| Admin / ORM inbegrepen | Nee (kies je apart) | Django: ja; Express: nee |
Veelgestelde vragen
Is FastAPI sneller dan Django?
Bij I/O wel. FastAPI draait asynchroon op ASGI en verwerkt daardoor duidelijk meer gelijktijdige verzoeken met database- of HTTP-aanroepen dan het klassieke synchrone Django. Django brengt daarentegen meer functies standaard mee.
Waarvoor is FastAPI niet geschikt?
Voor sterk CPU-intensieve taken (beeldverwerking, zware berekeningen) is Python trager dan Go of Rust; dat werk verplaats je naar aparte workers. Daarnaast levert FastAPI geen kant-en-klare adminomgeving mee zoals Django.
Heeft FastAPI een ORM nodig?
Niet per se. Wij zetten SQLAlchemy 2.0 async in met Alembic voor de migraties, maar pure SQL kan net zo goed. Een ORM zit er niet bij, dus je kiest die passend bij het project.
Hoe schaal ik een FastAPI-backend?
Horizontaal: je draait meerdere Uvicorn-processen onder Gunicorn achter een load balancer, met Redis-cache en zware taken uitbesteed aan Celery. Het stateless ontwerp maakt het eenvoudig om zo nodig instances toe te voegen.