Python i FastAPI backend — moderni i skalabilni API-ji
FastAPI je referentni Python framework za asinhrone REST API-je. Spaja izvorne Python type hints sa automatskom Pydantic validacijom, automatski generisanom OpenAPI dokumentacijom i ASGI performansama uporedivim sa Node.js-om — bez žrtvovanja čitljivosti koda.
FastAPI — najbrži Python framework
FastAPI radi na Uvicorn-u (ASGI server) uz Gunicorn za rad sa više procesa u produkciji. Jednostavan endpoint koji čita iz Redis keša ne pristupa bazi podataka pri svakom zahtevu. Nativni Dependency Injection omogućava izolovano testiranje bilo kog sloja bez složenih mock-ova: autentifikacija, sesija baze podataka, rate limiting — svako je zavisnost koja se ubacuje.
OpenAPI 3.1 dokumentacija se generiše automatski iz type hints-a — Swagger UI i ReDoc dostupni su na `/docs` i `/redoc` u razvoju. Pydantic v2 šema (validator pisan u Rust-u) validira zahteve i odgovore 10–20 puta brže od Pydantic-a v1. Svako nevažeće 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 posle odgovora (email, webhook, log)
- Nativna podrška za WebSocket za funkcije u realnom vremenu (čet, obaveštenja)
- Rate limiting pomoću slowapi (zasnovan na limits) — po IP adresi i po korisniku
- Middleware za CORS, kompresiju (gzip/brotli), ID zahteva, merenje 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 bezbedno, bez stringova. Složeni upiti pišu se u SQLAlchemy Core (provera pri kompajliranju) ili čistom SQL-u preko `text()` sa bind parametrima — nikada interpolacijom stringova (potpuna zaštita od SQLi).
Alembic migracije se automatski generišu iz promena modela i ručno pregledaju pre primene. Svaka migracija ima testirane `upgrade()` i `downgrade()`. U produkciji se migracije izvršavaju u CI-ju pre deploy-a — baza je uvek sinhronizovana sa kodom. Connection pooling preko asyncpg-a sa veličinom pool-a koja se podešava po servisu.
- Zaključavanje na nivou reda pomoću `SELECT ... FOR UPDATE` za kritične konkurentne operacije
- Full-text pretraga sa pg_trgm i tsvector — bez Elasticsearch-a za jednostavne slučajeve
- JSONB za polustrukturisane podatke sa GIN indeksiranjem
- Particionisane tabele za tabele sa milionima redova (logovi, događaji)
Redis keširanje i horizontalno skaliranje
Redis 7 koristimo za aplikativni keš (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 — ne slepi TTL koji može da servira zastarele 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, Redis-a i verzijom deploy-a
- Strukturisano JSON logovanje (structlog) — kompatibilno sa Loki/Datadog/ELK
Prednosti i ograničenja
Prednosti
- ASGI performanse uporedive sa Node.js-om i Go-om na I/O operacijama.
- OpenAPI dokumentacija se automatski generiše iz type hints-a.
- Brza Pydantic v2 validacija, sa jasnim 422 greškama.
- Čitljiv kod, Python poznat većini timova.
Ograničenja
- Python je i dalje sporiji od Go-a ili Rust-a na zadacima koji intenzivno opterećuju CPU.
- async/await zahteva disciplinu — jedan blokirajući poziv blokira ceo event loop.
- Mlađi ekosistem od Django-a za funkcije „sve u kompletu“.
- Ne uključuje 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 ekstremno CPU-zahtevne aplikacije ili monolite sa gotovim adminom, Go odnosno Django mogu biti prikladniji.
Tabela specifikacija
| Mogućnost | Ograničenje / prag | Tipična upotreba | |
|---|---|---|---|
| Konkurentnost | async/await, neblokirajući I/O | CPU-zahtevni zadaci traže zasebne workere | API-ji sa mnogo poziva ka bazi/HTTP-u |
| Latencija | Čitanje iz Redis keša bez pristupa bazi | Raste sa serijalizacijom velikih payload-a | SaaS backend, mobilne aplikacije, realno vreme |
| Validacija i dokumentacija | Pydantic v2 + automatski OpenAPI 3.1 | Složena šema produžava vreme pokretanja | Javni API-ji sa Swagger/ReDoc-om |
| Tipična cena | 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 |
|---|---|---|
| Async performanse | Odlične (nativni ASGI) | Django delimično, Express dobre |
| Automatska OpenAPI dokumentacija | Da, iz type hints-a | Zahteva dodatne pakete |
| Ugrađeni admin / ORM | Ne (birate zasebno) | Django: da; Express: ne |
Često postavljana pitanja
Da li je FastAPI brži od Django-a?
Da, na I/O operacijama. FastAPI radi asinhrono na ASGI-ju, pa obrađuje znatno više istovremenih zahteva 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 intenzivno opterećuju CPU (obrada slika, težak numerički proračun) Python je sporiji od Go-a ili Rust-a; njih prebacujete na zasebne workere. Takođe, ne dolazi sa gotovim adminom kao Django.
Da li FastAPI-ju treba ORM?
Ne obavezno. Koristimo SQLAlchemy 2.0 async sa Alembic-om za migracije, ali možete pisati i čist SQL. ORM nije uključen, pa ga birate prema projektu.
Kako skaliram FastAPI backend?
Horizontalno: pokrećete više Uvicorn procesa pod Gunicorn-om, iza load balancer-a, uz Redis keš i teške zadatke prebačene na Celery. Stateless dizajn omogućava dodavanje instanci po potrebi.