Kihagy√°s

FastAPI

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/tiangolo/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.
  • 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

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:

Telepítés

$ 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.

$ pip install "uvicorn[standard]"

---> 100%

Példa

Hozd létre

  • Hozz l√©tre a main.py f√°jlt a k√∂vetkezŇĎ tartalommal:
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:

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:

$ 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:

{"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

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

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.

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

  • 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

  • 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

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

√Ė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:

item_id: int

Egy komplexebb Item modellnek:

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:

    return {"item_name": item.name, "item_id": item_id}

...ezt:

        ... "item_name": item.name ...

...erre:

        ... "item_price": item.price ...

... √Čs figyeld meg hogy a szerkesztŇĎ automatikusan tudni fogja a t√≠pusokat √©s kieg√©sz√≠ti azokat:

editor support

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:

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