Python i FastAPI backend — moderni, skalabilni API-ji
FastAPI je referentni Python framework za asinhrone REST API-je. Spaja izvorne Python type hintove s automatskom Pydantic validacijom, automatski generiranom OpenAPI dokumentacijom i ASGI performansama uporedivim s Node.js — bez žrtvovanja čitljivosti koda.
FastAPI — najbrži Python framework
FastAPI radi na Uvicornu (ASGI server) s Gunicornom za više procesa u produkciji. Jednostavan endpoint koji čita iz Redis keša odgovara za manje od 5 ms na standardnom hardveru. Izvorni Dependency Injection omogućava izolirano testiranje svakog sloja bez složenih mockova: autentifikacija, sesija baze podataka, ograničavanje broja zahtjeva — svaki je ubrizgiva zavisnost.
OpenAPI 3.1 dokumentacija automatski se generira iz type hintova — Swagger UI i ReDoc dostupni su na `/docs` i `/redoc` u razvoju. Pydantic v2 shema (validator zasnovan na Rustu) validira zahtjeve i odgovore 10–20 puta brže od Pydantica v1. Svako neispravno polje vraća 422 s jasnim, lokaliziranim porukama o grešci.
- Izvorni async/await — neblokirajući I/O na svim operacijama s bazom i HTTP-om
- BackgroundTasks za operacije nakon odgovora (e-pošta, webhook, log)
- Izvorna podrška za WebSocket za funkcije u realnom vremenu (chat, obavijesti)
- Ograničavanje broja zahtjeva sa slowapi (zasnovano na limits) — po IP-u i po korisniku
- CORS, kompresija (gzip/brotli), request ID, timing middleware
PostgreSQL, SQLAlchemy i Alembic
Za sve operacije s bazom koristimo SQLAlchemy 2.0 async (asyncpg driver). Modeli se definiraju s Mapped tipovima — tipski sigurno, bez stringova. Složeni upiti pišu se u SQLAlchemy Core (provjera pri kompajliranju) ili čistom SQL-u putem `text()` s bind parametrima — nikad interpolacija stringova (potpuna prevencija SQLi).
Alembic migracije automatski se generiraju iz promjena modela i ručno pregledaju prije primjene. Svaka migracija ima testirane `upgrade()` i `downgrade()`. U produkciji se migracije izvršavaju u CI-ju prije isporuke — baza podataka je uvijek usklađena s kodom. Connection pooling putem asyncpg s podesivom veličinom pula po servisu.
- Zaključavanje na nivou reda pomoću `SELECT ... FOR UPDATE` za kritične istovremene operacije
- Pretraga cijelog teksta s pg_trgm i tsvector — bez Elasticsearcha za jednostavne slučajeve
- JSONB za polustrukturirane podatke s GIN indeksiranjem
- Particionirane tabele za tabele s milionima redova (logovi, događaji)
Redis keširanje i horizontalna skalabilnost
Redis 7 koristi se za keš aplikacije (TTL po endpointu), pohranu sesija (JWT refresh tokeni sa selektivnim opozivom), pub/sub za događaje u realnom vremenu i redove za pozadinske poslove (Celery ili ARQ). Strategija keširanja je cache-aside s eksplicitnom invalidacijom — a ne slijepi TTL koji može posluživati zastarjele podatke.
- JWT autentifikacija s access tokenom (15 min) + Redis refresh tokenom (7 dana)
- Celery + Redis broker za asinhrone zadatke (generiranje PDF-a, e-pošta, uvozi)
- Health check endpoint `/health` sa stanjem baze, Redisa i verzijom isporuke
- Strukturirano JSON logiranje (structlog) — kompatibilno s Loki/Datadog/ELK
Prednosti i nedostaci
Prednosti
- ASGI performanse uporedive s Node.js i Go na I/O operacijama.
- OpenAPI dokumentacija automatski generirana iz type hintova.
- Brza Pydantic v2 validacija, s jasnim 422 greškama.
- Čitljiv kod, Python poznat većini timova.
Ograničenja
- Python ostaje sporiji od Goa ili Rusta na zadacima koji opterećuju CPU.
- async/await zahtijeva disciplinu — jedan blokirajući poziv zaustavlja cijelu petlju događaja.
- Mlađi ekosistem od Djanga kad su u pitanju gotove ugrađene funkcije.
- Nema ugrađenog ORM-a ni admina — birate ih posebno.
Brzi zaključak
Odaberite FastAPI za asinhrone REST API-je, mikroservise i backend za SPA/mobilne aplikacije. Za ekstremne CPU-intenzivne aplikacije ili monolite s gotovim adminom bolji izbor mogu biti Go odnosno Django.
Tabela specifikacija
| Mogućnost | Ograničenje / prag | Tipična upotreba | |
|---|---|---|---|
| Istovremenost | async/await, neblokirajući I/O | CPU-intenzivni zadaci traže zasebne workere | API-ji s mnogo poziva prema bazi/HTTP-u |
| Latencija | < 5ms po endpointu s Redis kešom | Raste sa serijalizacijom velikih payloada | SaaS, mobilni, backend u realnom vremenu |
| Validacija i dokumentacija | Pydantic v2 + OpenAPI 3.1 automatski | Složene sheme povećavaju vrijeme pokretanja | Javni API-ji sa Swagger/ReDoc |
| Tipični trošak | Open-source, radi na 1 vCPU | Horizontalno skaliranje traži više procesa | Od MVP-a do produkcije |
FastAPI naspram alternativa
| Kriterij | FastAPI | Django / Express |
|---|---|---|
| Asinhrone performanse | Odlične (izvorni ASGI) | Django djelimično, Express dobro |
| Automatska OpenAPI dokumentacija | Da, iz type hintova | Traži dodatne pakete |
| Ugrađeni admin / ORM | Ne (birate posebno) | Django: da; Express: ne |
Često postavljana pitanja
Je li FastAPI brži od Djanga?
Da, za I/O. FastAPI radi asinhrono na ASGI-ju, pa obrađuje mnogo više istovremenih zahtjeva s pozivima prema bazi/HTTP-u od klasičnog sinhronog Djanga. Django, međutim, ima više ugrađenih funkcija.
Za šta FastAPI nije pogodan?
Za zadatke koji jako opterećuju CPU (obrada slika, teški numerički proračuni) Python je sporiji od Goa ili Rusta; takve zadatke prebacujete na zasebne workere. Također nema gotov admin kao Django.
Treba li FastAPI ORM?
Nije obavezno. Koristimo SQLAlchemy 2.0 async s Alembicom za migracije, ali možete pisati čisti SQL. ORM nije uključen u paket, pa ga birate po projektu.
Kako skalirati FastAPI backend?
Horizontalno: pokrenite više Uvicorn procesa pod Gunicornom iza load balancera, s Redis kešom i teškim zadacima prebačenim na Celery. Stateless dizajn omogućava dodavanje instanci po potrebi.