Python és FastAPI backend — modern, skálázható API-k
Az aszinkron REST API-k terén a FastAPI a Python etalonja. Natív Python type hint-ekre épít, ehhez automatikus Pydantic-validációt, magától előálló OpenAPI-dokumentációt és Node.js szintű ASGI-teljesítményt ad — anélkül, hogy a kód olvashatóságát feláldozná.
FastAPI — gyors Python-keretrendszer
A FastAPI Uvicornon (ASGI-szerver) fut, éles környezetben Gunicornnal, hogy több folyamaton dolgozzon. Egy egyszerű végpont, amely a Redis-gyorsítótárból olvas, átlagos hardveren válaszol. A beépített Dependency Injection minden réteget önmagában, bonyolult mockolás nélkül tesztelhetővé tesz: a hitelesítés, az adatbázis-munkamenet és a rate limiting egyaránt injektálható függőség.
Az OpenAPI 3.1 dokumentáció a type hint-ekből magától áll elő — fejlesztés közben a Swagger UI a `/docs`, a ReDoc a `/redoc` címen érhető el. A Pydantic v2 séma (Rust nyelven írt validátorral) gyorsabban ellenőrzi a kéréseket és a válaszokat, mint a Pydantic v1. Minden hibás mező 422-es választ vált ki, világos, honosított hibaüzenettel.
- Natív async/await — nem blokkoló I/O minden adatbázis- és HTTP-műveletnél
- BackgroundTasks a válasz utáni munkához (e-mail, webhook, naplózás)
- Natív WebSocket-támogatás a valós idejű funkciókhoz (chat, értesítések)
- Rate limiting a slowapi csomaggal (a limits alapján) — IP-nként és felhasználónként
- Middleware CORS-hoz, tömörítéshez (gzip/brotli), request ID-hoz és időméréshez
PostgreSQL, SQLAlchemy és Alembic
Minden adatbázis-műveletet SQLAlchemy 2.0 async (asyncpg-illesztőprogram) végez. A modelleket Mapped típusokkal írjuk le — típusbiztosan, sztringek nélkül. Az összetettebb lekérdezések SQLAlchemy Core-ban készülnek (amit a fordítás ellenőriz), vagy tiszta SQL-ként a `text()` függvényen át, kötött paraméterekkel — sosem sztringbehelyettesítéssel, így az SQL-injekció teljesen kizárt.
Az Alembic-migrációk a modellek változásából automatikusan állnak elő, alkalmazás előtt pedig kézi ellenőrzésen mennek át. Minden migrációnak letesztelt `upgrade()` és `downgrade()` függvénye van. Éles környezetben a migrációk a CI-ban futnak le a telepítés előtt — az adatbázis így mindig együtt mozog a kóddal. A kapcsolatkészletet az asyncpg kezeli, szolgáltatásonként állítható mérettel.
- Sorszintű zárolás `SELECT ... FOR UPDATE` utasítással a kritikus párhuzamos műveletekhez
- Teljes szövegű keresés pg_trgm-mel és tsvectorral — egyszerűbb esetekben Elasticsearch nélkül
- JSONB a félig strukturált adatokhoz, GIN-indexszel
- Particionált táblák a többmilliós sorszámhoz (naplók, események)
Redis-gyorsítótár és vízszintes skálázás
A Redis 7 alkalmazásszintű gyorsítótárként (végpontonkénti TTL-lel), munkamenet-tárolóként (JWT frissítő tokenek szelektív visszavonással), a valós idejű események pub/sub csatornájaként és a háttérfeladatok sorául szolgál (Celery vagy ARQ). A gyorsítótárazás cache-aside elven, kifejezett érvénytelenítéssel működik — nem vak TTL-lel, amely elavult adatot szolgálna ki.
- JWT-hitelesítés hozzáférési tokennel (15 perc) és Redisben tárolt frissítő tokennel (7 nap)
- Celery Redis brókerrel az aszinkron feladatokhoz (PDF-előállítás, e-mail, importálás)
- `/health` állapotvégpont az adatbázis, a Redis és a telepített verzió állapotával
- Strukturált JSON-naplózás (structlog) — a Lokival, a Datadoggal és az ELK-val is működik
Előnyök és korlátok
Előnyök
- I/O-terhelésnél Node.js és Go szintjén mozgó ASGI-teljesítmény.
- A type hint-ekből automatikusan előálló OpenAPI-dokumentáció.
- Gyors Pydantic v2 validáció, világos 422-es hibákkal.
- Olvasható kód; a Python a legtöbb csapatnak ismerős.
Korlátok
- CPU-igényes feladatoknál a Python továbbra is lassabb a Gónál vagy a Rustnál.
- Az async/await fegyelmet kíván — egyetlen blokkoló hívás megbénítja az egész eseményhurkot.
- A batteries-included funkciók terén fiatalabb az ökoszisztéma, mint a Django esetében.
- Sem ORM, sem admin felület nincs benne — mindkettőt külön kell választani.
Rövid értékelés
A FastAPI aszinkron REST API-khoz, mikroszolgáltatásokhoz, valamint SPA- és mobilalkalmazások backendjéhez való. Kifejezetten CPU-igényes alkalmazásokhoz a Go, kész admin felülettel bíró monolitokhoz pedig a Django illik jobban.
Specifikációs táblázat
| Képesség | Korlát / küszöb | Jellemző felhasználás | |
|---|---|---|---|
| Párhuzamosság | async/await, nem blokkoló I/O | A CPU-igényes munkához külön worker kell | Sok adatbázis- és HTTP-hívást indító API-k |
| Késleltetés | Végpontonként Redis-gyorsítótárral | Nagy payloadok szerializálásával nő | SaaS-, mobil- és valós idejű backendek |
| Validáció és dokumentáció | Pydantic v2 és automatikus OpenAPI 3.1 | Az összetett sémák lassítják az indulást | Nyilvános API-k Swaggerrel vagy ReDoc-kal |
| Jellemző költség | Nyílt forráskódú, 1 vCPU-n is elfut | A vízszintes skálázáshoz több folyamat kell | Az MVP-től az éles üzemig |
A FastAPI és az alternatívái
| Szempont | FastAPI | Django / Express |
|---|---|---|
| Aszinkron teljesítmény | Kiváló (natív ASGI) | Django részben, Express jól |
| Automatikus OpenAPI-dokumentáció | Igen, a type hint-ekből | További csomagokat igényel |
| Beépített admin / ORM | Nincs (külön kell választani) | Django: van; Express: nincs |
Gyakori kérdések
Gyorsabb a FastAPI a Djangónál?
I/O esetén igen. A FastAPI aszinkron módon, ASGI-n fut, ezért adatbázis- vagy HTTP-hívásokat végző kérésekből sokkal többet szolgál ki párhuzamosan, mint a klasszikus, szinkron Django. Cserébe a Django több funkciót hoz magával alapból.
Mire nem alkalmas a FastAPI?
Erősen CPU-igényes feladatokra (képfeldolgozás, nehéz számítások) a Python lassabb a Gónál vagy a Rustnál; az ilyen munkát külön workerekre érdemes átvinni. Ráadásul a FastAPI nem hoz kész admin felületet, ahogy a Django igen.
Szüksége van a FastAPI-nak ORM-re?
Nem feltétlenül. Mi SQLAlchemy 2.0 asyncot használunk Alembic-migrációkkal, de tiszta SQL-lel is lehet dolgozni. ORM nincs benne, így a projekthez illőt lehet választani.
Hogyan skálázható egy FastAPI-backend?
Vízszintesen: több Uvicorn-folyamat fut Gunicorn alatt, terheléselosztó mögött, Redis-gyorsítótárral, a nehéz feladatokat pedig a Celery veszi át. Az állapotmentes felépítés miatt szükség esetén egyszerűen bővíthető újabb példányokkal.