Python i FastAPI backend — moderni, skalabilni API-ji
FastAPI je referentni Python framework za asinhrone REST API-je. Spaja nativne Python tipske anotacije sa automatskom Pydantic validacijom, automatski generisanom OpenAPI dokumentacijom i ASGI performansama uporedivim sa Node.js — bez žrtvovanja čitljivosti koda.
FastAPI — najbrži Python framework
FastAPI radi na Uvicornu (ASGI server) sa Gunicornom za više procesa u produkciji. Jednostavan endpoint koji čita iz Redis keša odgovara za manje od 5 ms na standardnom hardveru. Nativni Dependency Injection omogućava izolovano testiranje bilo kog sloja bez složenih mockova: autentifikacija, sesija baze podataka, ograničavanje broja zahtjeva — sve je to dependency koji se ubacuje.
OpenAPI 3.1 dokumentacija automatski se generiše iz tipskih anotacija — Swagger UI i ReDoc dostupni su na `/docs` i `/redoc` u razvoju. Pydantic v2 šema (validator zasnovan na Rustu) validira zahtjeve i odgovore 10–20 puta brže nego Pydantic v1. Svako neispravno polje vraća 422 sa jasnim, lokalizovanim porukama o grešci.
- Nativni async/await — neblokirajući I/O na svim operacijama sa bazom i HTTP-om
- BackgroundTasks za operacije nakon odgovora (email, webhook, log)
- Nativna podrška za WebSocket za funkcije u realnom vremenu (chat, obavještenja)
- Ograničavanje broja zahtjeva sa slowapi (zasnovano na limits) — po IP adresi i po korisniku
- CORS, kompresija (gzip/brotli), request ID, middleware za mjerenje vremena
PostgreSQL, SQLAlchemy i Alembic
Za sve operacije sa bazom koristimo SQLAlchemy 2.0 async (asyncpg drajver). Modeli se definišu pomoću Mapped tipova — tipski bezbjedno, bez stringova. Složeni upiti pišu se u SQLAlchemy Core (provjera u vrijeme kompajliranja) ili čistom SQL-u preko `text()` sa bind parametrima — nikada interpolacijom stringova (potpuna prevencija SQL injekcije).
Alembic migracije automatski se generišu iz promjena modela i ručno se pregledaju prije primjene. Svaka migracija ima testirane `upgrade()` i `downgrade()`. U produkciji se migracije izvršavaju u CI-ju prije isporuke — baza je uvijek usklađena sa kodom. Connection pooling preko asyncpg sa podesivom veličinom pula po servisu.
- Zaključavanje na nivou reda sa `SELECT ... FOR UPDATE` za kritične istovremene operacije
- Pretraga punog teksta sa pg_trgm i tsvector — bez Elasticsearcha u jednostavnim slučajevima
- JSONB za polustrukturirane podatke sa GIN indeksiranjem
- Particionisane tabele za tabele sa milionima redova (logovi, događaji)
Redis keširanje i horizontalna skalabilnost
Redis 7 koristi se za keš aplikacije (TTL po endpointu), skladište 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 sa eksplicitnom invalidacijom — a ne slijepi TTL koji može poslužiti zastarjele podatke.
- JWT autentifikacija sa access tokenom (15 min) + Redis refresh tokenom (7 dana)
- Celery + Redis broker za asinhrone zadatke (generisanje PDF-a, email, uvozi)
- Health check endpoint `/health` sa statusom baze, Redisa i verzijom isporuke
- Strukturirani JSON logovi (structlog) — kompatibilni sa Loki/Datadog/ELK
Prednosti i mane
Prednosti
- ASGI performanse uporedive sa Node.js i Go na I/O operacijama.
- OpenAPI dokumentacija automatski generisana iz tipskih anotacija.
- Brza Pydantic v2 validacija, sa jasnim 422 greškama.
- Čitljiv kôd, Python poznat većini timova.
Ograničenja
- Python je i dalje sporiji od Goa ili Rusta na zadacima koji opterećuju CPU.
- async/await traži disciplinu — jedan blokirajući poziv zaustavlja cijelu event petlju.
- Mlađi ekosistem od Djanga kad su u pitanju gotove funkcije.
- Nema ugrađen ORM ni admin — birate ih zasebno.
Kratak zaključak
Izaberite FastAPI za asinhrone REST API-je, mikroservise i backend za SPA/mobilne aplikacije. Za ekstremne CPU zadatke ili monolite sa gotovim adminom bolji izbor mogu biti Go, odnosno Django.
Tabela specifikacija
| Mogućnost | Ograničenje / prag | Tipična upotreba | |
|---|---|---|---|
| Konkurentnost | async/await, neblokirajući I/O | CPU zadaci zahtijevaju zasebne workere | API-ji sa mnogo poziva ka bazi/HTTP-u |
| Latencija | < 5ms po endpointu sa Redis kešom | Raste sa serijalizacijom velikih payloada | SaaS, mobilni i backend u realnom vremenu |
| Validacija i dokumentacija | Pydantic v2 + OpenAPI 3.1 automatski | Složene šeme povećavaju vrijeme pokretanja | Javni API-ji sa Swagger/ReDoc |
| Tipičan trošak | Open-source, radi na 1 vCPU | Horizontalno skaliranje traži više procesa | Od MVP-a do produkcije |
FastAPI naspram alternativa
| Kriterijum | FastAPI | Django / Express |
|---|---|---|
| Asinhrone performanse | Odlične (nativni ASGI) | Django djelimično, Express dobro |
| Automatska OpenAPI dokumentacija | Da, iz tipskih anotacija | Potrebni su dodatni paketi |
| Ugrađeni admin / ORM | Ne (biraju se zasebno) | Django: da; Express: ne |
Česta pitanja
Da li je FastAPI brži od Djanga?
Da za I/O. FastAPI radi asinhrono na ASGI-ju, pa obrađuje daleko više istovremenih zahtjeva sa pozivima ka bazi/HTTP-u nego klasični sinhroni Django. 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đe nema gotov admin kao Django.
Da li FastAPI treba ORM?
Nije obavezan. Koristimo SQLAlchemy 2.0 async sa Alembicom za migracije, ali možete pisati i čist SQL. ORM nije u paketu, pa ga birate po projektu.
Kako skalirati FastAPI backend?
Horizontalno: pokrenite više Uvicorn procesa pod Gunicornom iza load balancera, uz Redis keš i teške zadatke prebačene na Celery. Stateless dizajn omogućava dodavanje instanci po potrebi.