FastAPI

FastAPI keretrendszer, nagy teljesítmény, könnyen tanulható, gyorsan kódolható, productionre kész

Test Coverage Package version Supported Python versions

--- **Dokumentáció**: https://fastapi.tiangolo.com **Forrás kód**: https://github.com/fastapi/fastapi --- A FastAPI egy modern, gyors (nagy teljesítményű), webes keretrendszer API-ok építéséhez Python -al, a Python szabványos típusjelöléseire építve. Kulcs funkciók: * **Gyors**: Nagyon nagy teljesítmény, a **NodeJS**-el és a **Go**-val egyenrangú (a Starlettenek és a Pydantic-nek köszönhetően). [Az egyik leggyorsabb Python keretrendszer](#performance). * **Gyorsan kódolható**: A funkciók fejlesztési sebességét 200-300 százalékkal megnöveli. * * **Kevesebb hiba**: Körülbelül 40%-al csökkenti az emberi (fejlesztői) hibák számát. * * **Intuitív**: Kiváló szerkesztő támogatás. Kiegészítés mindenhol. Kevesebb hibakereséssel töltött idő. * **Egyszerű**: Egyszerű tanulásra és használatra tervezve. Kevesebb dokumentáció olvasással töltött idő. * **Rövid**: Kód duplikáció minimalizálása. Több funkció minden paraméter deklarálásával. Kevesebb hiba. * **Robosztus**: Production ready kód. Automatikus interaktív dokumentáció val. * **Szabvány alapú**: Az API-ok nyílt szabványaira alapuló (és azokkal teljesen kompatibilis): OpenAPI (korábban Swagger néven ismert) és a JSON Schema. * Egy production alkalmazásokat építő belső fejlesztői csapat tesztjein alapuló becslés. ## Szponzorok {% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%} {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %} További szponzorok ## Vélemények "_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._"
Kabir Khan - Microsoft (ref)
--- "_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_"
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
--- "_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_"
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- "_I’m over the moon excited about **FastAPI**. It’s so fun!_"
Brian Okken - Python Bytes podcast host (ref)
--- "_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._"
Timothy Crosley - Hug creator (ref)
--- "_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_" "_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_"
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
--- "_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._"
Deon Pillsbury - Cisco (ref)
--- ## **Typer**, a CLI-ok FastAPI-ja Ha egy olyan CLI alkalmazást fejlesztesz amit a parancssorban kell használni webes API helyett, tekintsd meg: **Typer**. **Typer** a FastAPI kistestvére. A **CLI-k FastAPI-ja**. ⌨️ 🚀 ## Követelmények A FastAPI óriások vállán áll: * Starlette a webes részekhez. * Pydantic az adat részekhez. ## Telepítés
```console $ pip install fastapi ---> 100% ```
A production-höz egy ASGI szerverre is szükség lesz, mint például az Uvicorn vagy a Hypercorn.
```console $ pip install "uvicorn[standard]" ---> 100% ```
## Példa ### Hozd létre * Hozz létre a `main.py` fájlt a következő tartalommal: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ```
Vagy használd az async def-et... Ha a kódod `async` / `await`-et, használ `async def`: ```Python hl_lines="9 14" from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` **Megjegyzés**: Ha nem tudod, tekintsd meg a _"Sietsz?"_ szekciót `async` és `await`-ről dokumentációba.
### Futtasd le Indítsd el a szervert a következő paranccsal:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
A parancsról uvicorn main:app --reload... A `uvicorn main:app` parancs a következőre utal: * `main`: fájl `main.py` (a Python "modul"). * `app`: a `main.py`-ban a `app = FastAPI()` sorral létrehozott objektum. * `--reload`: kód változtatás esetén újra indítja a szervert. Csak fejlesztés közben használandó.
### Ellenőrizd Nyisd meg a böngésződ a következő címen: http://127.0.0.1:8000/items/5?q=somequery. A következő JSON választ fogod látni: ```JSON {"item_id": 5, "q": "somequery"} ``` Máris létrehoztál egy API-t ami: * HTTP kéréseket fogad a `/` és `/items/{item_id}` _útvonalakon_. * Mindkét _útvonal_ a `GET` műveletet használja (másik elnevezés: HTTP _metódus_). * A `/items/{item_id}` _útvonalnak_ van egy _path paramétere_, az `item_id`, aminek `int` típusúnak kell lennie. * A `/items/{item_id}` _útvonalnak_ még van egy opcionális, `str` típusú _query paramétere_ is, a `q`. ### Interaktív API dokumentáció Most nyisd meg a http://127.0.0.1:8000/docs címet. Az automatikus interaktív API dokumentációt fogod látni (amit a Swagger UI-al hozunk létre): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Alternatív API dokumentáció És most menj el a http://127.0.0.1:8000/redoc címre. Az alternatív automatikus dokumentációt fogod látni. (lásd ReDoc): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## Példa frissítése Módosítsuk a `main.py` fájlt, hogy `PUT` kérések esetén tudjon body-t fogadni. Deklaráld a body-t standard Python típusokkal, a Pydantic-nak köszönhetően. ```Python hl_lines="4 9-12 25-27" from typing import Union from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float is_offer: Union[bool, None] = None @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} @app.put("/items/{item_id}") def update_item(item_id: int, item: Item): return {"item_name": item.name, "item_id": item_id} ``` A szerver automatikusan újraindul (mert hozzáadtuk a --reload paramétert a fenti `uvicorn` parancshoz). ### Interaktív API dokumentáció frissítése Most menj el a http://127.0.0.1:8000/docs címre. * Az interaktív API dokumentáció automatikusan frissült így már benne van az új body. ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * Kattints rá a "Try it out" gombra, ennek segítségével kitöltheted a paramétereket és közvetlen használhatod az API-t: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) * Ezután kattints az "Execute" gompra, a felhasználói felület kommunikálni fog az API-oddal. Elküldi a paramétereket és a visszakapott választ megmutatja a képernyődön. ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) ### Alternatív API dokumentáció frissítés Most menj el a http://127.0.0.1:8000/redoc címre. * Az alternatív dokumentáció szintúgy tükrözni fogja az új kérési paraméter és body-t. ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### Összefoglalás Összegzésül, deklarálod **egyszer** a paraméterek, body, stb típusát funkciós paraméterekként. Ezt standard modern Python típusokkal csinálod. Nem kell új szintaxist, vagy specifikus könyvtár mert metódósait, stb. megtanulnod. Csak standard **Python**. Például egy `int`-nek: ```Python item_id: int ``` Egy komplexebb `Item` modellnek: ```Python item: Item ``` ... És csupán egy deklarációval megkapod a: * Szerkesztő támogatást, beleértve: * Szövegkiegészítés. * Típus ellenőrzés. * Adatok validációja: * Automatikus és érthető hibák amikor az adatok hibásak. * Validáció mélyen ágyazott objektumok esetén is. * Bemeneti adatok átváltása : a hálózatról érkező Python adatokká és típusokká. Adatok olvasása következő forrásokból: * JSON. * Cím paraméterek. * Query paraméterek. * Cookie-k. * Header-ök. * Formok. * Fájlok. * Kimeneti adatok átváltása: Python adatok is típusokról hálózati adatokká: * válts át Python típusokat (`str`, `int`, `float`, `bool`, `list`, etc). * `datetime` csak objektumokat. * `UUID` objektumokat. * Adatbázis modelleket. * ...És sok mást. * Automatikus interaktív dokumentáció, beleértve két alternatív dokumentációt is: * Swagger UI. * ReDoc. --- Visszatérve az előző kód példához. A **FastAPI**: * Validálja hogy van egy `item_id` mező a `GET` és `PUT` kérésekben. * Validálja hogy az `item_id` `int` típusú a `GET` és `PUT` kérésekben. * Ha nem akkor látni fogunk egy tiszta hibát ezzel kapcsolatban. * ellenőrzi hogyha van egy opcionális query paraméter `q` névvel (azaz `http://127.0.0.1:8000/items/foo?q=somequery`) `GET` kérések esetén. * Mivel a `q` paraméter `= None`-al van deklarálva, ezért opcionális. * `None` nélkül ez a mező kötelező lenne (mint például a body `PUT` kérések esetén). * a `/items/{item_id}` címre érkező `PUT` kérések esetén, a JSON-t a következőképpen olvassa be: * Ellenőrzi hogy létezik a kötelező `name` nevű attribútum és `string`. * Ellenőrzi hogy létezik a kötelező `price` nevű attribútum és `float`. * Ellenőrzi hogy létezik a `is_offer` nevű opcionális paraméter, ami ha létezik akkor `bool` * Ez ágyazott JSON objektumokkal is működik * JSONről való automatikus konvertálás. * dokumentáljuk mindent OpenAPI-al amit használható: * Interaktív dokumentációs rendszerekkel. * Automatikus kliens kód generáló a rendszerekkel, több nyelven. * Hozzá tartozik kettő interaktív dokumentációs web felület. --- Eddig csak a felszínt kapargattuk, de a lényeg hogy most már könnyebben érthető hogyan működik. Próbáld kicserélni a következő sorban: ```Python return {"item_name": item.name, "item_id": item_id} ``` ...ezt: ```Python ... "item_name": item.name ... ``` ...erre: ```Python ... "item_price": item.price ... ``` ... És figyeld meg hogy a szerkesztő automatikusan tudni fogja a típusokat és kiegészíti azokat: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) Teljesebb példákért és funkciókért tekintsd meg a Tutorial - User Guide -t. **Spoiler veszély**: a Tutorial - User Guidehoz tartozik: * **Paraméterek** deklarációja különböző helyekről: **header-ök**, **cookie-k**, **form mezők** és **fájlok**. * Hogyan állíts be **validációs feltételeket** mint a `maximum_length` vagy a `regex`. * Nagyon hatékony és erős **Függőség Injekció** rendszerek. * Biztonság és autentikáció beleértve, **OAuth2**, **JWT tokens** és **HTTP Basic** támogatást. * Több haladó (de ugyanannyira könnyű) technika **mélyen ágyazott JSON modellek deklarációjára** (Pydantic-nek köszönhetően). * **GraphQL** integráció Strawberry-vel és más könyvtárakkal. * több extra funkció (Starlette-nek köszönhetően) pl.: * **WebSockets** * rendkívül könnyű tesztek HTTPX és `pytest` alapokra építve * **CORS** * **Cookie Sessions** * ...és több. ## Teljesítmény A független TechEmpower benchmarkok szerint az Uvicorn alatt futó **FastAPI** alkalmazások az egyik leggyorsabb Python keretrendszerek közé tartoznak, éppen lemaradva a Starlette és az Uvicorn (melyeket a FastAPI belsőleg használ) mögött.(*) Ezeknek a további megértéséhez: Benchmarks. ## Opcionális követelmények Pydantic által használt: * email-validator - e-mail validációkra. * pydantic-settings - Beállítások követésére. * pydantic-extra-types - Extra típusok Pydantic-hoz. Starlette által használt: * httpx - Követelmény ha a `TestClient`-et akarod használni. * jinja2 - Követelmény ha az alap template konfigurációt akarod használni. * python-multipart - Követelmény ha "parsing"-ot akarsz támogatni, `request.form()`-al. * itsdangerous - Követelmény `SessionMiddleware` támogatáshoz. * pyyaml - Követelmény a Starlette `SchemaGenerator`-ának támogatásához (valószínűleg erre nincs szükség FastAPI használása esetén). FastAPI / Starlette által használt * uvicorn - Szerverekhez amíg betöltik és szolgáltatják az applikációdat. * orjson - Követelmény ha `ORJSONResponse`-t akarsz használni. * ujson - Követelmény ha `UJSONResponse`-t akarsz használni. Ezeket mind telepítheted a `pip install "fastapi[all]"` paranccsal. ## Licensz Ez a projekt az MIT license, licensz alatt fut