Zaledje Python in FastAPI — sodobni in razširljivi API-ji
FastAPI je referenčno ogrodje Python za asinhrone REST API-je. Združuje izvorne type hints Pythona s samodejnim preverjanjem Pydantic, samodejno ustvarjeno dokumentacijo OpenAPI in asinhrono izvajanje na ASGI — brez žrtvovanja berljivosti kode.
FastAPI — asinhrono ogrodje Python na ASGI
FastAPI teče na Uvicornu (strežnik ASGI) z Gunicornom za več procesov v produkciji. Končne točke, ki berejo iz predpomnilnika Redis, se izognejo poizvedbam v zbirko podatkov. Izvorno vbrizgavanje odvisnosti (Dependency Injection) omogoča izolirano testiranje katere koli plasti brez zapletenih mockov: avtentikacija, seja zbirke podatkov, omejevanje hitrosti — vsako je vbrizgljiva odvisnost.
Dokumentacija OpenAPI 3.1 se samodejno ustvari iz type hints — Swagger UI in ReDoc sta v razvoju na voljo na `/docs` in `/redoc`. Pydantic v2 (z jedrom za preverjanje, napisanim v Rustu) preverja zahteve in odgovore. Vsako neveljavno polje vrne 422 z jasnimi, lokaliziranimi sporočili o napaki.
- Izvorni async/await — neblokirajoči I/O pri vseh operacijah z zbirko in HTTP
- BackgroundTasks za operacije po odgovoru (e-pošta, webhook, dnevnik)
- Izvorna podpora za WebSocket pri funkcijah v realnem času (klepet, obvestila)
- Omejevanje hitrosti s slowapi (temelji na limits) — na IP in na uporabnika
- Middleware CORS, stiskanje (gzip/brotli), ID zahteve, merjenje časa
PostgreSQL, SQLAlchemy in Alembic
Za vse operacije z zbirko uporabljamo SQLAlchemy 2.0 async (gonilnik asyncpg). Modeli so definirani z Mapped tipi — tipsko varno, brez nizov. Kompleksne poizvedbe pišemo v SQLAlchemy Core (preverjeno ob prevajanju) ali v čistem SQL prek `text()` s parametri bind — nikoli z interpolacijo nizov (popolna preventiva pred SQLi).
Migracije Alembic se samodejno ustvarijo iz sprememb modela in pred uporabo ročno pregledajo. Vsaka migracija ima preizkušeni `upgrade()` in `downgrade()`. V produkciji migracije tečejo v CI pred namestitvijo — zbirka podatkov je vedno usklajena s kodo. Zbiranje povezav (connection pooling) prek asyncpg z velikostjo bazena, nastavljivo za vsako storitev.
- Zaklepanje na ravni vrstic s `SELECT ... FOR UPDATE` za kritične sočasne operacije
- Iskanje po celotnem besedilu s pg_trgm in tsvector — brez Elasticsearcha pri preprostih primerih
- JSONB za napol strukturirane podatke z indeksiranjem GIN
- Particionirane tabele za tabele z milijoni vrstic (dnevniki, dogodki)
Predpomnjenje z Redis in vodoravno skaliranje
Redis 7 uporabljamo za aplikacijski predpomnilnik (TTL na končno točko), shrambo sej (osvežilni žetoni JWT z izbirnim preklicem), pub/sub za dogodke v realnem času in čakalne vrste za opravila v ozadju (Celery ali ARQ). Strategija predpomnjenja je cache-aside z izrecno razveljavitvijo — ne slepi TTL, ki lahko streže zastarele podatke.
- Avtentikacija JWT z dostopnim žetonom (15 min) + osvežilnim žetonom v Redisu (7 dni)
- Celery + posrednik Redis za asinhrona opravila (ustvarjanje PDF, e-pošta, uvozi)
- Končna točka za preverjanje zdravja `/health` s stanjem zbirke, Redisa in različico namestitve
- Strukturirano beleženje JSON (structlog) — združljivo z Loki/Datadog/ELK
Prednosti in omejitve
Prednosti
- Izvorni async/await na ASGI, z neblokirajočim I/O.
- Samodejno ustvarjena dokumentacija OpenAPI iz type hints.
- Hitro preverjanje Pydantic v2 z jasnimi napakami 422.
- Berljiva koda, Python je znan večini ekip.
Omejitve
- Python je pri procesorsko intenzivnih opravilih še vedno počasnejši od Goja ali Rusta.
- async/await zahteva disciplino — en blokirajoč klic blokira celotno zanko dogodkov.
- Ekosistem je mlajši od Djanga pri funkcijah »vse v enem«.
- Ne vključuje vgrajenega ORM-ja ali administracije — izberete ju posebej.
Kratek povzetek
FastAPI izberite za asinhrone REST API-je, mikrostoritve in zaledja za SPA/mobilne aplikacije. Za skrajno procesorsko omejene aplikacije ali monolite z že pripravljeno administracijo sta primernejša Go oziroma Django.
Tabela specifikacij
| Zmožnost | Omejitev / prag | Tipična uporaba | |
|---|---|---|---|
| Sočasnost | async/await, neblokirajoči I/O | Procesorsko omejena opravila zahtevajo ločene delavce | API-ji z veliko klici zbirke/HTTP |
| Zakasnitev | Predpomnilnik Redis pred zbirko podatkov pri končnih točkah z veliko branja | Raste s serializacijo velikih podatkovnih obremenitev | Zaledje SaaS, mobilno, v realnem času |
| Preverjanje in dokumentacija | Pydantic v2 + samodejni OpenAPI 3.1 | Kompleksna shema podaljša čas zagona | Javni API-ji s Swagger/ReDoc |
| Tipičen strošek | Odprta koda, teče na 1 vCPU | Vodoravno skaliranje zahteva več procesov | Od MVP do produkcije |
FastAPI v primerjavi z alternativami
| Merilo | FastAPI | Django / Express |
|---|---|---|
| Asinhroni model | Izvorno (ASGI) | Django delno, Express da |
| Samodejna dokumentacija OpenAPI | Da, iz type hints | Zahteva dodatne pakete |
| Vgrajena administracija / ORM | Ne (izberete posebej) | Django: da; Express: ne |
Pogosta vprašanja
Kakšna je razlika med FastAPI in Djangom?
FastAPI teče asinhrono na ASGI z neblokirajočim I/O, klasični Django pa zahteve obdeluje sinhrono. Django ima več vgrajenih funkcij, kot sta administracija in ORM.
Za kaj FastAPI ni primeren?
Pri procesorsko intenzivnih opravilih (obdelava slik, težki numerični izračuni) je Python počasnejši od Goja ali Rusta; ta prestavite na ločene delavce. In ne prinaša že pripravljene administracije kot Django.
Ali FastAPI potrebuje ORM?
Ni obvezno. Uporabljamo SQLAlchemy 2.0 async z Alembicom za migracije, lahko pa pišete čisti SQL. ORM ni vključen, zato ga izberete glede na projekt.
Kako skaliram zaledje FastAPI?
Vodoravno: poganjate več procesov Uvicorn pod Gunicornom, za porazdeljevalnikom obremenitve, s predpomnilnikom Redis in težkimi opravili, prestavljenimi na Celery. Zasnova brez stanja omogoča dodajanje instanc po potrebi.