Backend v Pythonu a FastAPI — moderní a škálovatelná API
FastAPI je referenční pythonový framework pro asynchronní REST API. Spojuje nativní type hints Pythonu s automatickou validací Pydantic, automaticky generovanou dokumentací OpenAPI a výkonem ASGI srovnatelným s Node.js — bez obětování čitelnosti kódu.
FastAPI — nejrychlejší framework v Pythonu
FastAPI běží na Uvicornu (ASGI server) s Gunicornem pro více procesů v produkci. Jednoduchý endpoint čtoucí z cache Redis odpovídá na běžném hardwaru pod 5 ms. Nativní Dependency Injection umožňuje izolované testování libovolné vrstvy bez složitých mocků: autentizace, databázová session, rate limiting — každé z nich je injektovatelná závislost.
Dokumentace OpenAPI 3.1 se generuje automaticky z type hints — Swagger UI a ReDoc jsou ve vývoji dostupné na `/docs` a `/redoc`. Schéma Pydantic v2 (validátor napsaný v Rustu) validuje požadavky i odpovědi 10–20× rychleji než Pydantic v1. Každé neplatné pole vrátí chybu 422 s jasnými, lokalizovanými chybovými hláškami.
- Nativní async/await — neblokující I/O u všech operací s DB i HTTP
- BackgroundTasks pro operace po odeslání odpovědi (e-mail, webhook, log)
- Nativní podpora WebSocketů pro funkce v reálném čase (chat, notifikace)
- Rate limiting se slowapi (postavené na limits) — per IP i per uživatel
- Middleware CORS, komprese (gzip/brotli), request ID, měření času
PostgreSQL, SQLAlchemy a Alembic
Pro všechny operace s databází používáme asynchronní SQLAlchemy 2.0 (ovladač asyncpg). Modely definujeme pomocí typů Mapped — typově bezpečně, bez řetězců. Složité dotazy píšeme v SQLAlchemy Core (kontrola při kompilaci) nebo v čistém SQL přes `text()` s bind parametry — nikdy ne interpolací řetězců (úplná prevence SQL injection).
Migrace Alembic se automaticky generují ze změn modelu a před nasazením se ručně kontrolují. Každá migrace má otestované `upgrade()` i `downgrade()`. V produkci migrace běží v CI před nasazením — databáze je vždy v synchronizaci s kódem. Connection pooling přes asyncpg s velikostí poolu nastavitelnou pro každou službu.
- Row-level locking přes `SELECT ... FOR UPDATE` pro kritické souběžné operace
- Fulltextové vyhledávání s pg_trgm a tsvector — bez Elasticsearche pro jednoduché případy
- JSONB pro polostrukturovaná data s indexací GIN
- Partitioned tables pro tabulky s miliony řádků (logy, události)
Cache v Redisu a horizontální škálování
Redis 7 používáme pro aplikační cache (TTL pro každý endpoint), úložiště session (refresh tokeny JWT s selektivním odvoláním), pub/sub pro události v reálném čase a fronty pro úlohy na pozadí (Celery nebo ARQ). Strategií cachování je cache-aside s explicitní invalidací — žádné slepé TTL, které může podávat zastaralá data.
- Autentizace JWT s access tokenem (15 min) + refresh tokenem v Redisu (7 dní)
- Celery + broker Redis pro asynchronní úlohy (generování PDF, e-mail, importy)
- Health check endpoint `/health` se stavem DB, Redisu a verzí nasazení
- Strukturované logování v JSON (structlog) — kompatibilní s Loki/Datadog/ELK
Výhody a omezení
Výhody
- Výkon ASGI srovnatelný s Node.js a Go u I/O operací.
- Dokumentace OpenAPI generovaná automaticky z type hints.
- Rychlá validace Pydantic v2 s jasnými chybami 422.
- Čitelný kód, Python známý většině týmů.
Omezení
- Python je u úloh náročných na CPU stále pomalejší než Go nebo Rust.
- async/await vyžaduje disciplínu — jediné blokující volání zablokuje celou event loop.
- Mladší ekosystém než Django, pokud jde o funkce „vše v balení“.
- Neobsahuje vestavěné ORM ani administraci — vybíráte je zvlášť.
Stručný verdikt
FastAPI zvolte pro asynchronní REST API, mikroslužby a backendy pro SPA/mobilní aplikace. Pro extrémně CPU-bound aplikace nebo monolity s hotovou administrací mohou být vhodnější Go, respektive Django.
Tabulka specifikací
| Schopnost | Limit / práh | Typické použití | |
|---|---|---|---|
| Souběžnost | async/await, neblokující I/O | CPU-bound úlohy vyžadují samostatné workery | API s mnoha voláními DB/HTTP |
| Latence | cache Redis na endpointu | Roste se serializací velkých payloadů | Backend pro SaaS, mobilní aplikace, real-time |
| Validace a dokumentace | Pydantic v2 + automatické OpenAPI 3.1 | Složité schéma prodlužuje čas startu | Veřejná API se Swaggerem/ReDoc |
| Typické náklady | Open source, běží na 1 vCPU | Horizontální škálování vyžaduje více procesů | Od MVP po produkci |
FastAPI vs. alternativy
| Kritérium | FastAPI | Django / Express |
|---|---|---|
| Asynchronní výkon | Výborný (nativní ASGI) | Django částečně, Express dobrý |
| Automatická dokumentace OpenAPI | Ano, z type hints | Vyžaduje další balíčky |
| Vestavěná administrace / ORM | Ne (vybíráte zvlášť) | Django: ano; Express: ne |
Často kladené otázky
Je FastAPI rychlejší než Django?
Ano u I/O. FastAPI běží asynchronně na ASGI, takže zvládne mnohem více souběžných požadavků s voláními DB/HTTP než klasické synchronní Django. Django však nabízí více vestavěných funkcí.
Pro co FastAPI není vhodné?
U úloh silně náročných na CPU (zpracování obrazu, těžké numerické výpočty) je Python pomalejší než Go nebo Rust; takové úlohy přesouváte na samostatné workery. Také nepřichází s hotovou administrací jako Django.
Potřebuje FastAPI ORM?
Nutně ne. Používáme asynchronní SQLAlchemy 2.0 s Alembicem pro migrace, ale můžete psát čisté SQL. ORM není součástí, takže ho volíte podle projektu.
Jak škálovat backend ve FastAPI?
Horizontálně: spustíte více procesů Uvicornu pod Gunicornem za load balancerem, s cache v Redisu a těžkými úlohami přesunutými do Celery. Stateless design umožňuje přidávat instance podle potřeby.