Zum Inhalt

FastAPI

FastAPI

FastAPI-Framework, hohe Performanz, leicht zu lernen, schnell zu entwickeln, produktionsreif

Test Testabdeckung Package-Version UnterstĂŒtzte Python-Versionen


Dokumentation: https://fastapi.tiangolo.com/de

Quellcode: https://github.com/fastapi/fastapi


FastAPI ist ein modernes, schnelles (hoch performantes) Webframework zur Erstellung von APIs mit Python auf Basis von Standard-Python-Typhinweisen.

Seine SchlĂŒssel-Merkmale sind:

  • Schnell: Sehr hohe Performanz, auf Augenhöhe mit NodeJS und Go (dank Starlette und Pydantic). Eines der schnellsten verfĂŒgbaren Python-Frameworks.
  • Schnell zu entwickeln: Erhöhen Sie die Geschwindigkeit bei der Entwicklung von Features um etwa 200 % bis 300 %. *
  • Weniger Bugs: Verringern Sie die von Menschen (Entwicklern) verursachten Fehler um etwa 40 %. *
  • Intuitiv: Hervorragende Editor-UnterstĂŒtzung. Code-VervollstĂ€ndigung ĂŒberall. Weniger Zeit mit Debuggen verbringen.
  • Einfach: So konzipiert, dass es einfach zu benutzen und zu erlernen ist. Weniger Zeit mit dem Lesen von Dokumentation verbringen.
  • Kurz: Minimieren Sie die Verdoppelung von Code. Mehrere Features aus jeder Parameterdeklaration. Weniger Bugs.
  • Robust: Erhalten Sie produktionsreifen Code. Mit automatischer, interaktiver Dokumentation.
  • Standards-basiert: Basierend auf (und vollstĂ€ndig kompatibel mit) den offenen Standards fĂŒr APIs: OpenAPI (frĂŒher bekannt als Swagger) und JSON Schema.

* SchÀtzung basierend auf Tests in einem internen Entwicklungsteam, das Produktionsanwendungen erstellt.

Sponsoren

Andere Sponsoren

Meinungen

„[...] Ich verwende FastAPI heutzutage sehr oft. [...] Ich habe tatsĂ€chlich vor, es fĂŒr alle ML-Services meines Teams bei Microsoft zu verwenden. Einige davon werden in das Kernprodukt Windows und einige Office-Produkte integriert.“

Kabir Khan – Microsoft (Ref.)

„Wir haben die FastAPI-Bibliothek ĂŒbernommen, um einen REST-Server zu erstellen, der fĂŒr Vorhersagen abgefragt werden kann. [fĂŒr Ludwig]“

Piero Molino, Yaroslav Dudin, und Sai Sumanth Miryala – Uber (Ref.)

„Netflix freut sich, die Open-Source-Veröffentlichung unseres Krisenmanagement-Orchestrierung-Frameworks bekannt zu geben: Dispatch! [erstellt mit FastAPI]“

Kevin Glisson, Marc Vilanova, Forest Monsen – Netflix (Ref.)

„Ich bin hellauf begeistert von FastAPI. Es macht so viel Spaß!“

Brian Okken – Python Bytes Podcast-Host (Ref.)

„Ehrlich, was Du gebaut hast, sieht super solide und poliert aus. In vielerlei Hinsicht ist es so, wie ich Hug haben wollte – es ist wirklich inspirierend, jemanden so etwas bauen zu sehen.“

Timothy Crosley – Hug-Autor (Ref.)

„Wenn Sie ein modernes Framework zum Erstellen von REST-APIs erlernen möchten, schauen Sie sich FastAPI an. [...] Es ist schnell, einfach zu verwenden und leicht zu lernen [...]“

„Wir haben zu FastAPI fĂŒr unsere APIs gewechselt [...] Ich denke, es wird Ihnen gefallen [...]“

Ines Montani – Matthew Honnibal – Explosion AI-GrĂŒnder – spaCy-Autoren (Ref.) – (Ref.)

„Falls irgendjemand eine Produktions-Python-API erstellen möchte, kann ich FastAPI wĂ€rmstens empfehlen. Es ist wunderschön konzipiert, einfach zu verwenden und hoch skalierbar; es ist zu einer SchlĂŒsselkomponente unserer API-First-Entwicklungsstrategie geworden und treibt viele Automatisierungen und Services an, wie etwa unseren Virtual TAC Engineer.“

Deon Pillsbury – Cisco (Ref.)

Typer, das FastAPI der CLIs

Wenn Sie eine CLI-Anwendung fĂŒr das Terminal erstellen, anstelle einer Web-API, schauen Sie sich Typer an.

Typer ist die kleine Schwester von FastAPI. Und es soll das FastAPI der CLIs sein. ⌚ 🚀

Anforderungen

FastAPI steht auf den Schultern von Giganten:

Installation

Erstellen und aktivieren Sie eine virtuelle Umgebung und installieren Sie dann FastAPI:

$ pip install "fastapi[standard]"

---> 100%

Hinweis: Stellen Sie sicher, dass Sie "fastapi[standard]" in AnfĂŒhrungszeichen setzen, damit es in allen Terminals funktioniert.

Beispiel

Erstellung

Erstellen Sie eine Datei main.py mit:

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}
Oder verwenden Sie async def ...

Wenn Ihr Code async / await verwendet, benutzen Sie 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}

Hinweis:

Wenn Sie das nicht kennen, schauen Sie sich den Abschnitt „In Eile?“ ĂŒber async und await in der Dokumentation an.

Starten

Starten Sie den Server mit:

$ fastapi dev main.py

 ╭────────── FastAPI CLI - Development mode ───────────╼
 │                                                     │
 │  Serving at: http://127.0.0.1:8000                  │
 │                                                     │
 │  API docs: http://127.0.0.1:8000/docs               │
 │                                                     │
 │  Running in development mode, for production use:   │
 │                                                     │
 │  fastapi run                                        │
 │                                                     │
 ╰─────────────────────────────────────────────────────╯

INFO:     Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [2248755] using WatchFiles
INFO:     Started server process [2248757]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
Was der Befehl fastapi dev main.py macht ...

Der Befehl fastapi dev liest Ihre main.py-Datei, erkennt die FastAPI-App darin und startet einen Server mit Uvicorn.

StandardmĂ€ĂŸig wird fastapi dev mit aktiviertem Auto-Reload fĂŒr die lokale Entwicklung gestartet.

Sie können mehr darĂŒber in der FastAPI CLI Dokumentation lesen.

Es testen

Öffnen Sie Ihren Browser unter http://127.0.0.1:8000/items/5?q=somequery.

Sie sehen die JSON-Response als:

{"item_id": 5, "q": "somequery"}

Sie haben bereits eine API erstellt, welche:

  • HTTP-Requests auf den Pfaden / und /items/{item_id} entgegennimmt.
  • Beide Pfade nehmen GET Operationen (auch bekannt als HTTP-Methoden) entgegen.
  • Der Pfad /items/{item_id} hat einen Pfad-Parameter item_id, der ein int sein sollte.
  • Der Pfad /items/{item_id} hat einen optionalen str-Query-Parameter q.

Interaktive API-Dokumentation

Gehen Sie nun auf http://127.0.0.1:8000/docs.

Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von Swagger UI):

Swagger UI

Alternative API-Dokumentation

Und jetzt gehen Sie auf http://127.0.0.1:8000/redoc.

Sie sehen die alternative automatische Dokumentation (bereitgestellt von ReDoc):

ReDoc

Beispiel Aktualisierung

Ändern Sie jetzt die Datei main.py, um den Body eines PUT-Requests zu empfangen.

Deklarieren Sie den Body mit Standard-Python-Typen, dank Pydantic.

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}

Der fastapi dev-Server sollte automatisch neu laden.

Interaktive API-Dokumentation aktualisieren

Gehen Sie jetzt auf http://127.0.0.1:8000/docs.

  • Die interaktive API-Dokumentation wird automatisch aktualisiert, einschließlich des neuen Bodys:

Swagger UI

  • Klicken Sie auf den Button „Try it out“, damit können Sie die Parameter ausfĂŒllen und direkt mit der API interagieren:

Swagger UI Interaktion

  • Klicken Sie dann auf den Button „Execute“, die BenutzeroberflĂ€che wird mit Ihrer API kommunizieren, sendet die Parameter, holt die Ergebnisse und zeigt sie auf dem Bildschirm an:

Swagger UI Interaktion

Alternative API-Dokumentation aktualisieren

Und jetzt gehen Sie auf http://127.0.0.1:8000/redoc.

  • Die alternative Dokumentation wird ebenfalls den neuen Query-Parameter und Body widerspiegeln:

ReDoc

Zusammenfassung

Zusammengefasst deklarieren Sie einmal die Typen von Parametern, Body, usw. als Funktionsparameter.

Das machen Sie mit modernen Standard-Python-Typen.

Sie mĂŒssen keine neue Syntax, Methoden oder Klassen einer bestimmten Bibliothek usw. lernen.

Nur Standard-Python.

Zum Beispiel fĂŒr ein int:

item_id: int

oder fĂŒr ein komplexeres Item-Modell:

item: Item

... und mit dieser einen Deklaration erhalten Sie:

  • Editor-UnterstĂŒtzung, einschließlich:
    • Code-VervollstĂ€ndigung.
    • TypprĂŒfungen.
  • Validierung von Daten:
    • Automatische und eindeutige Fehler, wenn die Daten ungĂŒltig sind.
    • Validierung sogar fĂŒr tief verschachtelte JSON-Objekte.
  • Konvertierung von Eingabedaten: Aus dem Netzwerk kommend, zu Python-Daten und -Typen. Lesen von:
    • JSON.
    • Pfad-Parametern.
    • Query-Parametern.
    • Cookies.
    • Headern.
    • Formularen.
    • Dateien.
  • Konvertierung von Ausgabedaten: Konvertierung von Python-Daten und -Typen zu Netzwerkdaten (als JSON):
    • Konvertieren von Python-Typen (str, int, float, bool, list, usw.).
    • datetime-Objekte.
    • UUID-Objekte.
    • Datenbankmodelle.
    • ... und viele mehr.
  • Automatische interaktive API-Dokumentation, einschließlich zwei alternativer BenutzeroberflĂ€chen:
    • Swagger UI.
    • ReDoc.

Um auf das vorherige Codebeispiel zurĂŒckzukommen, FastAPI wird:

  • Validieren, dass es eine item_id im Pfad fĂŒr GET- und PUT-Requests gibt.
  • Validieren, ob die item_id vom Typ int fĂŒr GET- und PUT-Requests ist.
    • Falls nicht, sieht der Client einen hilfreichen, klaren Fehler.
  • PrĂŒfen, ob es einen optionalen Query-Parameter namens q (wie in http://127.0.0.1:8000/items/foo?q=somequery) fĂŒr GET-Requests gibt.
    • Da der q-Parameter mit = None deklariert ist, ist er optional.
    • Ohne das None wĂ€re er erforderlich (wie der Body im Fall von PUT).
  • Bei PUT-Requests an /items/{item_id} den Body als JSON lesen:
    • PrĂŒfen, ob er ein erforderliches Attribut name hat, das ein str sein muss.
    • PrĂŒfen, ob er ein erforderliches Attribut price hat, das ein float sein muss.
    • PrĂŒfen, ob er ein optionales Attribut is_offer hat, das ein bool sein muss, falls vorhanden.
    • All dies wĂŒrde auch fĂŒr tief verschachtelte JSON-Objekte funktionieren.
  • Automatisch von und nach JSON konvertieren.
  • Alles mit OpenAPI dokumentieren, welches verwendet werden kann von:
    • Interaktiven Dokumentationssystemen.
    • Automatisch Client-Code generierenden Systemen fĂŒr viele Sprachen.
  • Zwei interaktive Dokumentations-WeboberflĂ€chen direkt bereitstellen.

Wir haben nur an der OberflÀche gekratzt, aber Sie bekommen schon eine Vorstellung davon, wie das Ganze funktioniert.

Versuchen Sie, diese Zeile zu Àndern:

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

... von:

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

... zu:

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

... und sehen Sie, wie Ihr Editor die Attribute automatisch vervollstÀndigt und ihre Typen kennt:

Editor UnterstĂŒtzung

FĂŒr ein vollstĂ€ndigeres Beispiel, mit weiteren Funktionen, siehe das Tutorial – Benutzerhandbuch.

Spoiler-Alarm: Das Tutorial – Benutzerhandbuch enthĂ€lt:

  • Deklaration von Parametern von anderen verschiedenen Stellen wie: Header, Cookies, Formularfelder und Dateien.
  • Wie man Validierungs-Constraints wie maximum_length oder regex setzt.
  • Ein sehr leistungsfĂ€higes und einfach zu bedienendes System fĂŒr Dependency Injection.
  • Sicherheit und Authentifizierung, einschließlich UnterstĂŒtzung fĂŒr OAuth2 mit JWT-Tokens und HTTP Basic Authentifizierung.
  • Fortgeschrittenere (aber ebenso einfache) Techniken zur Deklaration tief verschachtelter JSON-Modelle (dank Pydantic).
  • GraphQL-Integration mit Strawberry und anderen Bibliotheken.
  • Viele zusĂ€tzliche Features (dank Starlette) wie:
    • WebSockets
    • extrem einfache Tests auf Basis von HTTPX und pytest
    • CORS
    • Cookie-Sessions
    • ... und mehr.

Performanz

UnabhĂ€ngige TechEmpower-Benchmarks zeigen FastAPI-Anwendungen, die unter Uvicorn laufen, als eines der schnellsten verfĂŒgbaren Python-Frameworks, nur hinter Starlette und Uvicorn selbst (intern von FastAPI verwendet). (*)

Um mehr darĂŒber zu erfahren, siehe den Abschnitt Benchmarks.

AbhÀngigkeiten

FastAPI hÀngt von Pydantic und Starlette ab.

standard-AbhÀngigkeiten

Wenn Sie FastAPI mit pip install "fastapi[standard]" installieren, kommt es mit der standard-Gruppe optionaler AbhÀngigkeiten:

Verwendet von Pydantic:

Verwendet von Starlette:

  • httpx – erforderlich, wenn Sie den TestClient verwenden möchten.
  • jinja2 – erforderlich, wenn Sie die Default-Template-Konfiguration verwenden möchten.
  • python-multipart – erforderlich, wenn Sie Formulare mittels request.form() „parsen“ möchten.

Verwendet von FastAPI:

  • uvicorn – fĂŒr den Server, der Ihre Anwendung lĂ€dt und bereitstellt. Dies umfasst uvicorn[standard], das einige AbhĂ€ngigkeiten (z. B. uvloop) beinhaltet, die fĂŒr eine Bereitstellung mit hoher Performanz benötigt werden.
  • fastapi-cli[standard] – um den fastapi-Befehl bereitzustellen.
    • Dies beinhaltet fastapi-cloud-cli, das es Ihnen ermöglicht, Ihre FastAPI-Anwendung auf FastAPI Cloud bereitzustellen.

Ohne standard-AbhÀngigkeiten

Wenn Sie die standard optionalen AbhĂ€ngigkeiten nicht einschließen möchten, können Sie mit pip install fastapi statt pip install "fastapi[standard]" installieren.

Ohne fastapi-cloud-cli

Wenn Sie FastAPI mit den StandardabhÀngigkeiten, aber ohne das fastapi-cloud-cli installieren möchten, können Sie mit pip install "fastapi[standard-no-fastapi-cloud-cli]" installieren.

ZusÀtzliche optionale AbhÀngigkeiten

Es gibt einige zusÀtzliche AbhÀngigkeiten, die Sie installieren möchten.

ZusÀtzliche optionale Pydantic-AbhÀngigkeiten:

ZusÀtzliche optionale FastAPI-AbhÀngigkeiten:

  • orjson – erforderlich, wenn Sie ORJSONResponse verwenden möchten.
  • ujson – erforderlich, wenn Sie UJSONResponse verwenden möchten.

Lizenz

Dieses Projekt ist unter den Bedingungen der MIT-Lizenz lizenziert.