Python & FastAPI backend — modernas un mērogojamas API
FastAPI ir atsauces Python ietvars asinhroniem REST API. Tas apvieno natīvos Python type hints ar automātisku Pydantic validāciju, automātiski ģenerētu OpenAPI dokumentāciju un ASGI veiktspēju, kas salīdzināma ar Node.js — neupurējot koda lasāmību.
FastAPI — ātrākais Python ietvars
FastAPI darbojas uz Uvicorn (ASGI serveris) ar Gunicorn daudzprocesu režīmam produkcijā. Natīvā Dependency Injection ļauj izolēti testēt jebkuru slāni bez sarežģītiem mock objektiem: autentifikācija, datubāzes sesija, rate limiting — katrs no tiem ir injicējama atkarība.
OpenAPI 3.1 dokumentācija tiek ģenerēta automātiski no type hints — Swagger UI un ReDoc ir pieejami adresēs `/docs` un `/redoc` izstrādes vidē. Pydantic v2 shēma (uz Rust balstīts validators) validē pieprasījumus un atbildes 10–20 reizes ātrāk nekā Pydantic v1. Jebkurš nederīgs lauks atgriež 422 ar skaidriem, lokalizētiem kļūdu ziņojumiem.
- Natīvs async/await — neblokējošs I/O visām DB un HTTP darbībām
- BackgroundTasks darbībām pēc atbildes (e-pasts, webhook, žurnāls)
- Natīvs WebSocket atbalsts reāllaika funkcijām (čats, paziņojumi)
- Rate limiting ar slowapi (balstīts uz limits) — pēc IP un pēc lietotāja
- Middleware CORS, kompresija (gzip/brotli), request ID, laika mērījumi
PostgreSQL, SQLAlchemy un Alembic
Visām DB darbībām izmantojam SQLAlchemy 2.0 async (asyncpg draiveris). Modeļi tiek definēti ar Mapped tipiem — tipdrošiem, bez virknēm. Sarežģītus vaicājumus rakstām SQLAlchemy Core (pārbaudīti kompilēšanas laikā) vai tīrā SQL, izmantojot `text()` ar bind parametriem — nekad virkņu interpolāciju (pilnīga SQLi novēršana).
Alembic migrācijas tiek automātiski ģenerētas no modeļu izmaiņām un pirms pielietošanas pārskatītas manuāli. Katrai migrācijai ir notestētas `upgrade()` un `downgrade()`. Produkcijā migrācijas tiek palaistas CI vidē pirms izvietošanas — datubāze vienmēr ir sinhronizēta ar kodu. Savienojumu pūls (connection pooling) caur asyncpg ar katram pakalpojumam konfigurējamu pūla izmēru.
- Row-level locking ar `SELECT ... FOR UPDATE` kritiskām vienlaicīgām darbībām
- Pilnteksta meklēšana ar pg_trgm un tsvector — bez Elasticsearch vienkāršiem gadījumiem
- JSONB daļēji strukturētiem datiem ar GIN indeksāciju
- Sadalītās tabulas (partition tables) tabulām ar miljoniem rindu (logs, events)
Redis kešošana un horizontālā mērogošana
Redis 7 tiek izmantots lietojumprogrammas kešatmiņai (TTL katram endpoint), sesiju glabātuvei (JWT refresh tokens ar selektīvu atsaukšanu), pub/sub reāllaika notikumiem un rindām fona uzdevumiem (Celery vai ARQ). Kešošanas stratēģija ir cache-aside ar nepārprotamu atcelšanu — nevis akls TTL, kas var atdot novecojušus datus.
- JWT autentifikācija ar access token (15 min) + Redis refresh token (7 dienas)
- Celery + Redis broker asinhroniem uzdevumiem (PDF ģenerēšana, e-pasts, importi)
- Health check endpoint `/health` ar DB, Redis statusu un izvietotās versijas informāciju
- Strukturēta JSON žurnalēšana (structlog) — saderīga ar Loki/Datadog/ELK
Priekšrocības un ierobežojumi
Priekšrocības
- ASGI veiktspēja, kas I/O ziņā salīdzināma ar Node.js un Go.
- OpenAPI dokumentācija, kas automātiski ģenerēta no type hints.
- Ātra Pydantic v2 validācija ar skaidrām 422 kļūdām.
- Lasāms kods, Python ir pazīstams lielākajai daļai komandu.
Ierobežojumi
- Python joprojām ir lēnāks par Go vai Rust CPU intensīvos uzdevumos.
- async/await prasa disciplīnu — viens bloķējošs izsaukums bloķē visu event loop.
- Jaunāka ekosistēma nekā Django funkcijām „viss iekļauts”.
- Nesatur iebūvētu ORM vai admin — tos izvēlies atsevišķi.
Īss secinājums
Izvēlies FastAPI asinhroniem REST API, mikropakalpojumiem un SPA/mobilo lietotņu backend. Ļoti CPU intensīvām lietotnēm vai monolītiem ar gatavu admin piemērotāki var būt attiecīgi Go un Django.
Specifikāciju tabula
| Iespēja | Ierobežojums / slieksnis | Tipisks pielietojums | |
|---|---|---|---|
| Vienlaicīgums | async/await, neblokējošs I/O | CPU intensīvam darbam nepieciešami atsevišķi worker | API ar daudziem DB/HTTP izsaukumiem |
| Latentums | Redis kešatmiņa katram endpoint | Pieaug, serializējot lielus payload | SaaS backend, mobilās lietotnes, reāllaiks |
| Validācija un dokumentācija | Pydantic v2 + automātisks OpenAPI 3.1 | Sarežģīta shēma pagarina startēšanas laiku | Publiskie API ar Swagger/ReDoc |
| Tipiskās izmaksas | Atvērtā koda, darbojas uz 1 vCPU | Horizontālai mērogošanai nepieciešami vairāk procesu | No MVP līdz produkcijai |
FastAPI pret alternatīvām
| Kritērijs | FastAPI | Django / Express |
|---|---|---|
| Async veiktspēja | Teicama (natīvs ASGI) | Django daļēji, Express laba |
| Automātiska OpenAPI dokumentācija | Jā, no type hints | Nepieciešamas papildu pakotnes |
| Iebūvēts admin / ORM | Nē (izvēlies atsevišķi) | Django: jā; Express: nē |
Biežāk uzdotie jautājumi
Vai FastAPI ir ātrāks par Django?
Jā, I/O ziņā. FastAPI darbojas async uz ASGI, tāpēc ar DB/HTTP izsaukumiem apstrādā daudz vairāk vienlaicīgu pieprasījumu nekā klasiskais sinhronais Django. Tomēr Django piedāvā vairāk iebūvētu funkciju.
Kam FastAPI nav piemērots?
Ļoti CPU intensīviem uzdevumiem (attēlu apstrāde, smagi skaitliski aprēķini) Python ir lēnāks par Go vai Rust; tos pārceļ uz atsevišķiem worker. Turklāt tam nav gatavas admin kā Django.
Vai FastAPI nepieciešams ORM?
Ne obligāti. Mēs izmantojam SQLAlchemy 2.0 async ar Alembic migrācijām, taču vari rakstīt arī tīru SQL. ORM nav iekļauts, tāpēc to izvēlies atkarībā no projekta.
Kā mērogot FastAPI backend?
Horizontāli: palaid vairākus Uvicorn procesus zem Gunicorn, aiz load balancer, ar Redis kešatmiņu un smagajiem uzdevumiem, pārceltiem uz Celery. Stateless dizains ļauj pēc vajadzības pievienot instances.