14 KiB
Executable File
Im Folgenden bekommst du eine umfassende, aber einsteigerfreundliche Einführung in FastAPI.
1. Grundidee: Was ist FastAPI?
FastAPI ist ein modernes, schnelles Web-Framework für Python, mit dem du Web-APIs (Schnittstellen) bauen kannst.
Eine API ist eine „Schnittstelle“, über die andere Programme mit deinem Programm sprechen können – z. B. eine Web-App, ein Mobile-App-Backend oder interne Services in einem Unternehmen.
Kernpunkte von FastAPI:
- Schwerpunkt: Aufbau von HTTP-APIs (REST-APIs, JSON-basierte APIs).
- Geschwindigkeit: Sehr performant durch Nutzung von asynchronem Python (
async/await), basierend auf ASGI. - Typisierung: Starke Nutzung von Python-Typannotationen (z. B.
str,int, eigene Klassen).
→ Daraus entstehen automatisch:- Validierung von Daten,
- automatische Dokumentation (Swagger / OpenAPI),
- bessere IDE-Unterstützung (Autovervollständigung, Fehlererkennung).
- Auto-Dokumentation: FastAPI generiert automatisch eine interaktive API-Dokumentation im Browser.
Ein typisches „Hello World“ mit FastAPI sieht so aus:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello World"}
Starten kannst du das z. B. mit:
uvicorn main:app --reload
Dann ist die API z. B. unter http://127.0.0.1:8000 erreichbar.
2. Abgrenzung: FastAPI vs. verwandte Begriffe und Frameworks
2.1 FastAPI vs. „API“ / REST / HTTP allgemein
- HTTP: Das zugrunde liegende Protokoll, über das Browser oder andere Dienste kommunizieren.
- REST-API: Eine Art, HTTP-APIs zu strukturieren (z. B.
GET /users,POST /orders). - FastAPI: Ein Framework, das dir hilft, solche HTTP/REST-APIs in Python zu bauen.
FastAPI „spricht“ also HTTP, baut REST-APIs, ist aber selbst das Werkzeug, kein Protokoll.
2.2 FastAPI vs. Flask
Flask ist ein sehr bekanntes, minimalistisches Python-Webframework.
Ähnlichkeiten:
- Beide erlauben es, mit wenig Code HTTP-Endpunkte zu definieren.
- Beide sind relativ leichtgewichtig und flexibel.
Unterschiede:
- Asynchronität:
- Flask: traditionell synchron (WSGI), Async ist erst neuerdings und eingeschränkt verfügbar.
- FastAPI: von Anfang an für async gebaut (ASGI).
- Typen & Validierung:
- Flask: Kein eingebautes System für automatische Validierung – du machst das selbst oder mit Erweiterungen.
- FastAPI: Nutzt Pydantic-Modelle und Typannotationen → automatische Validierung.
- Dokumentation:
- Flask: Kein automatisches API-Dokumentations-UI.
- FastAPI: Automatisch generierte OpenAPI/Swagger-UI unter
/docsund/redoc.
Praxisbeispiel Vergleich:
Flask:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/items", methods=["POST"])
def create_item():
data = request.get_json()
name = data.get("name")
price = data.get("price")
if not isinstance(name, str) or not isinstance(price, (int, float)):
return jsonify({"error": "Invalid data"}), 400
return jsonify({"name": name, "price": price})
FastAPI:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.post("/items")
def create_item(item: Item):
# item ist schon validiert
return item
FastAPI übernimmt hier die Validierung automatisch.
2.3 FastAPI vs. Django (und Django REST Framework)
Django ist ein „Full-Stack“-Framework:
- liefert Templates, ORM (Datenbankzugriff), Admin-Interface, Auth-System, Formulare etc.
- ideal für klassische Webanwendungen mit HTML-Seiten.
Für APIs nutzt man meist Django REST Framework (DRF) als Erweiterung.
FastAPI dagegen ist:
- stärker auf APIs fokussiert,
- nicht „alles aus einer Hand“, sondern:
- Web-Layer:
Starlette, - Datenvalidierung:
Pydantic, - Datenbank: du wählst selbst z. B. SQLAlchemy, Tortoise ORM etc.
- Web-Layer:
Faustregel:
- Wenn du eine klassische Website mit HTML-Rendering brauchst → Django.
- Wenn du primär eine performant API bauen willst (z. B. für SPA, Microservices) → FastAPI ist sehr attraktiv.
2.4 FastAPI vs. Node.js / Express
Node.js + Express ist eine sehr verbreitete Lösung für APIs in JavaScript/TypeScript.
- Sprache: Node → JavaScript/TypeScript, FastAPI → Python.
- Typen: TypeScript kann Typen bieten, FastAPI nutzt Python-Typen + Pydantic.
- Ökosystem: Node sehr stark im Web-/Frontend-nahen Bereich, Python stark bei Data Science, Machine Learning und Backend-Services.
FastAPI ist besonders interessant, wenn du sowieso Python nutzt (z. B. wegen ML/AI) und dafür eine passende Web-API brauchst.
3. Welche Probleme löst FastAPI?
3.1 Saubere, valide Eingabedaten
Problem ohne Framework-Unterstützung:
- Du bekommst z. B. einen JSON-Body und musst:
- alle Felder prüfen (Typ, Pflichtfelder, Wertebereiche),
- Fehler verständlich zurückgeben,
- alles manuell machen.
FastAPI + Pydantic lösen das:
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class User(BaseModel):
name: str = Field(..., min_length=3)
age: int = Field(..., ge=0, le=120) # 0 <= age <= 120
@app.post("/users")
def create_user(user: User):
# Wenn name zu kurz oder age negativ ist, liefert FastAPI automatisch 422 mit Fehlerdetails
return {"message": "User created", "user": user}
Vorteil:
- Weniger Fehleranfälligkeit.
- Konsistente Fehlerantworten.
- Gute Developer-Erfahrung.
3.2 Automatische Dokumentation und Testbarkeit
FastAPI erzeugt automatisch eine OpenAPI-Spezifikation und UI:
http://localhost:8000/docs→ Swagger UI (interaktive Oberfläche, du kannst Requests direkt aus dem Browser abschicken).http://localhost:8000/redoc→ ReDoc, alternative Dokumentationsansicht.
Das hilft:
- Dir selbst beim Testen.
- Frontend-Entwicklern oder anderen Teams, die deine API nutzen.
- Beim automatisierten Generieren von Client-SDKs (z. B. TypeScript-Client).
3.3 Performance und asynchrones I/O
Problem:
- In „klassischen“ synchronen Webframeworks blockiert jeder Request, der z. B. auf eine externe API oder langsame DB wartet.
- Bei vielen gleichzeitigen Anfragen leiden Durchsatz und Antwortzeit.
FastAPI setzt auf ASGI (Asynchronous Server Gateway Interface) und async def:
from fastapi import FastAPI
import httpx # asynchroner HTTP-Client
app = FastAPI()
@app.get("/external")
async def call_external_api():
async with httpx.AsyncClient() as client:
response = await client.get("https://httpbin.org/get")
return response.json()
Vorteil:
- Viele I/O-lastige Requests können parallel abgewickelt werden.
- Besonders sinnvoll bei Microservices, die viel mit anderen Services kommunizieren.
3.4 Abhängigkeiten und Wiederverwendbarkeit (Dependency Injection)
FastAPI bietet ein eingebautes Dependency Injection-System.
Beim Entwickeln von APIs brauchst du häufig:
- Datenbankverbindungen,
- Authentifizierungslogik,
- Konfigurationsobjekte.
Ohne System würdest du das überall wiederholen oder global speichern.
Mit FastAPI:
from fastapi import Depends, FastAPI
app = FastAPI()
def get_settings():
# z. B. Konfiguration laden
return {"app_name": "Meine App"}
@app.get("/info")
def read_info(settings = Depends(get_settings)):
return {"app_name": settings["app_name"]}
Das verbessert:
- Testbarkeit (du kannst Dependencies im Test austauschen),
- Struktur deines Codes (klarere Trennung von Zuständigkeiten).
4. Typische Einsatzszenarien (praxisnah)
Beispiel 1: Einfaches CRUD für ein „Item“
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
app = FastAPI()
class Item(BaseModel):
id: int
name: str
price: float
# „Fake-Datenbank“ im Speicher
items_db: List[Item] = []
@app.post("/items", response_model=Item)
def create_item(item: Item):
# einfache Prüfung: ID darf nicht doppelt sein
if any(existing.id == item.id for existing in items_db):
raise HTTPException(status_code=400, detail="Item ID already exists")
items_db.append(item)
return item
@app.get("/items", response_model=List[Item])
def list_items():
return items_db
@app.get("/items/{item_id}", response_model=Item)
def get_item(item_id: int):
for item in items_db:
if item.id == item_id:
return item
raise HTTPException(status_code=404, detail="Item not found")
Du bekommst:
- JSON-APIs für CRUD,
- automatische Dokumentation,
- automatische Validierung für
Item.
Beispiel 2: Path-Parameter, Query-Parameter, Body
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
app = FastAPI()
class SearchFilters(BaseModel):
min_price: Optional[float] = None
max_price: Optional[float] = None
@app.get("/products/{category}")
def search_products(
category: str,
q: Optional[str] = None, # Query-Parameter ?q=Text
filters: SearchFilters = None # Body JSON
):
return {
"category": category,
"query": q,
"filters": filters
}
Beispiel-Request:
GET /products/books?q=pythonmit JSON-Body:{ "min_price": 10, "max_price": 50 }
FastAPI erkennt:
categoryals Pfadparameter,qals Query-Parameter,filtersals JSON-Body und validiert ihn.
Beispiel 3: Einfache Authentifizierung per Token
from fastapi import Depends, FastAPI, HTTPException, Header
app = FastAPI()
def get_current_user(x_token: str = Header(...)):
if x_token != "secrettoken123":
raise HTTPException(status_code=401, detail="Invalid or missing token")
return {"username": "alice"}
@app.get("/profile")
def read_profile(current_user = Depends(get_current_user)):
return {"message": f"Hello, {current_user['username']}"}
Hier:
- Der Endpunkt
/profileverlangt einen HTTP-HeaderX-Token. - FastAPI übernimmt das Zusammenspiel von Header → Dependency → Endpoint-Logik.
5. Herausforderungen und typische Stolpersteine
FastAPI nimmt dir viel ab, aber es gibt einige Themen, die für Einsteiger Hürden sein können:
5.1 Asynchrones Programmieren (async / await)
- Wenn du noch nie mit Async gearbeitet hast, ist es ungewohnt:
- Wann nutze ich
async def? - Wo brauche ich
await? - Was ist „Blocking I/O“?
- Wann nutze ich
- Du musst darauf achten, dass du asynchrone Bibliotheken verwendest, wenn du im Handler
asynceinsetzt
(z. B.httpxstattrequests,asyncpgstattpsycopg2).
Wenn du erst mal einsteigst, kannst du auch erst synchron (ohne async) starten und später umstellen.
5.2 Typannotationen und Pydantic verstehen
FastAPI baut stark auf Typen auf:
- Für jemanden ohne Erfahrung mit Typannotationen in Python ist das anfangs ungewohnt.
- Du musst verstehen:
- Wie du eigene Modelle mit
BaseModeldefinierst. - Wie optionale Felder mit
Optional[...]und Standardwerten funktionieren. - Wie Validierung und Fehlernachrichten von Pydantic aussehen.
- Wie du eigene Modelle mit
Aber:
Der Lerneffekt lohnt sich, weil du insgesamt saubereren, stabileren Code bekommst.
5.3 Datenbankintegration
FastAPI selbst bringt keinen ORM mit. Du musst wählen:
- z. B. SQLAlchemy, Tortoise-ORM, Prisma, Gino etc.
Dabei stellen sich Fragen wie:
- Wie verwalte ich Datenbank-Sessions pro Request?
- Nutze ich die sync- oder async-Variante meiner ORM?
- Wie realisiere ich Migrations (alembic, etc.)?
Es gibt viele Beispielprojekte, aber es ist ein zusätzlicher Schritt im Vergleich zu Django, wo ein ORM „eingebaut“ ist.
5.4 Deployment / Betrieb
Für Einsteiger ist der Weg von „läuft lokal“ zu „läuft im Internet“ oft herausfordernd:
- FastAPI-Anwendung läuft typischerweise mit:
- Themen:
- Logging konfigurieren,
- Umgebungsvariablen (Konfiguration),
- HTTPS/SSL (z. B. via Nginx/Let’s Encrypt),
- Skalierung (mehrere Worker, z. B.
gunicorn+uvicorn.workers.UvicornWorker).
Für den Anfang kannst du auch auf Plattformen wie Render, Railway, fly.io, oder Docker + Cloud setzen.
5.5 Versionierung und Wartung großer Projekte
Bei größeren APIs:
- Wie strukturiere ich meinen Code?
- z. B. mit Routern (
APIRouter) und Modulen.
- z. B. mit Routern (
- Wie versioniere ich die API? (
/v1/user,/v2/user, …) - Wie halte ich die Dokumentation aktuell?
- FastAPI hilft zwar, aber bei vielen Endpunkten braucht man Konventionen und ggf. zusätzliche Dokumentation.
Beispiel mit Router:
from fastapi import FastAPI, APIRouter
app = FastAPI()
items_router = APIRouter(prefix="/items", tags=["items"])
@items_router.get("/")
def list_items():
return [{"id": 1, "name": "Item 1"}]
app.include_router(items_router)
So kannst du größere Projekte modular strukturieren.
6. Zusammenfassung
-
FastAPI ist ein modernes Framework für Web-APIs in Python, fokussiert auf:
- hohe Performance (async),
- Typen + automatische Validierung (Pydantic),
- automatische OpenAPI-/Swagger-Dokumentation,
- gute Developer Experience.
-
Es unterscheidet sich von:
- Flask: moderner, stärker typisiert, async-first, integrierte Validierung & Doku.
- Django: kein Full-Stack-Framework, sondern eher API-fokussiert; du kombinierst es mit eigenen Tools für DB, Templates etc.
- Node/Express: andere Sprache, andere Ökosysteme; FastAPI besonders stark, wenn du ohnehin Python nutzt.
-
Es löst typische Probleme beim API-Bau:
- Validierung von Eingaben,
- Dokumentation & Testbarkeit,
- Performance bei vielen gleichzeitigen Anfragen,
- saubere Struktur durch Dependency Injection.
-
Herausforderungen:
- Einstieg in asynchrones Programmieren,
- Verständnis von Typannotationen & Pydantic,
- separate Auswahl & Integration einer Datenbanklösung,
- Deployment & Betrieb.