In den letzten Jahren hat sich die Welt der Python-Entwicklung grundlegend verändert. Immer mehr Teams entscheiden sich für FastAPI für neue Projekte und verdrängen damit nach und nach Django, ein Framework, das seit vielen Jahren der Industriestandard ist. Lassen Sie uns herausfinden, was los ist und warum Entwickler-Anfänger auf FastAPI achten sollten.
Was sind FastAPI und Django?
Django ist ein voll funktionsfähiges Web-Framework, das seit 2005 existiert. Es wurde für die Entwicklung vollwertiger Webanwendungen mit einem integrierten Admin-Panel, ORM, einem Vorlagensystem und vielen anderen Möglichkeiten "out of the box" entwickelt.
FastAPI — ein modernes Framework, das 2018 erschien und speziell für die API-Entwicklung entwickelt wurde. Es basiert auf modernen Funktionen von Python 3.7+ und asynchroner Programmierung.
Warum gewinnt FastAPI an Popularität?
1. Leistung wie bei Go und Node.js
FastAPI ist eines der schnellsten Python-Frameworks dank seiner Asynchronität. Hier ist ein einfacher Vergleich:
# Django (synchroner Ansatz)
from django.http import JsonResponse
def get_users(request):
users = User.objects.all() # Sperranfrage
return JsonResponse({'users': list(users.values())})# FastAPI (asynchroner Ansatz)
from fastapi import FastAPI
from typing import List
app = FastAPI()
@app.get("/users")
async def get_users() -> List[dict]:
users = await database.fetch_all("SELECT * FROM users")
return users💡 Wichtig: In FastAPI werden Anfragen asynchron verarbeitet, sodass der Server Tausende von Verbindungen gleichzeitig ohne Blockierung bedienen kann. Django unterstützt Asynchronität auch ab Version 3.1, aber das Ökosystem ist noch nicht vollständig angepasst.
2. Unglaublich einfacher Start
Die erste API in FastAPI kann in nur 5 Minuten erstellt werden:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello, world!"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}Wir starten mit dem Befehl:
uvicorn main:app --reload✅ Und das ist alles! Sie haben bereits eine funktionierende API. Keine Einstellungen, Konfigurationsdateien oder komplexe Projektstrukturen.
3. Automatische Dokumentation ist Magie
Eine der coolsten Funktionen von FastAPI ist die automatische interaktive Dokumentation. Öffnen Sie einfach http://localhost:8000/docs und Sie sehen die vollständige Swagger-UI-Dokumentation, in der Sie jeden Endpunkt direkt im Browser testen können.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(
title="My project's API",
description="Description of all endpoints",
version="1.0.0"
)
class Item(BaseModel):
name: str
description: str = None
price: float
@app.post("/items/")
async def create_item(item: Item):
"""
Creating a new product:
- **name**: product name
- **description**: description (optional)
- **price**: product price
"""
return {"item": item}Die Dokumentation wird automatisch aus Datentypen und Docstrings generiert. In Django müssen Sie dazu zusätzliche Bibliotheken wie drf-spectacular verwenden.
4. Standardisierung und Validierung von der Stange
FastAPI verwendet Pydantic für die automatische Datenvalidierung:
from pydantic import BaseModel, EmailStr, validator
from typing import Optional
class User(BaseModel):
username: str
email: EmailStr
age: Optional[int] = None
@validator('age')
def age_must_be_positive(cls, v):
if v is not None and v < 0:
raise ValueError('Age cannot be negative')
return v
@app.post("/users/")
async def create_user(user: User):
# Wenn die Daten ungültig sind, gibt FastAPI automatisch einen 422-Fehler zurück
# mit einer detaillierten Beschreibung des Problems
return {"user": user}Wenn Sie ungültige Daten senden, erhalten Sie eine verständliche Fehlermeldung, in der alle Probleme aufgeführt sind.
5. Moderne Arbeit mit Abhängigkeiten
Dependency Injection in FastAPI macht den Code sauber und testbar:
from fastapi import Depends, HTTPException
from sqlalchemy.orm import Session
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
def get_current_user(token: str = Header(...)):
user = verify_token(token)
if not user:
raise HTTPException(status_code=401, detail="Unauthorized")
return user
@app.get("/users/me")
async def read_current_user(
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
return current_userAbhängigkeiten werden automatisch aufgelöst und implementiert. Dies macht das Testen unglaublich einfach.
6. WebSocket und Hintergrundaufgaben
from fastapi import WebSocket, BackgroundTasks
import time
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Received: {data}")
def write_log(message: str):
time.sleep(5) # Lange Operation
with open("log.txt", "a") as f:
f.write(message)
@app.post("/send-notification/")
async def send_notification(
email: str,
background_tasks: BackgroundTasks
):
background_tasks.add_task(write_log, f"Sent to {email}")
return {"message": "Notification will be sent"}
Wann sollte man sich für Django entscheiden?
FastAPI ist nicht immer die beste Wahl. Django ist vorzuziehen, wenn Sie Folgendes benötigen:
Vollwertige Webanwendung mit Admin-Panel — Django Admin sofort einsatzbereit
Authentifizierungs- und Berechtigungssystem — fertig und bewährt
ORM mit Migrationen — Django ORM ist einfacher für Anfänger
Integriertes Vorlagensystem — wenn serverseitiges Rendering benötigt wird
Riesiges Paket-Ökosystem — Django gibt es seit 19 Jahren
Praktisches Beispiel: CRUD-API
Erstellen wir eine einfache CRUD-API zur Aufgabenverwaltung:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime
app = FastAPI()
class Task(BaseModel):
id: Optional[int] = None
title: str
description: Optional[str] = None
completed: bool = False
created_at: Optional[datetime] = None
# Temporärer Speicher (verwenden Sie in der Realität eine Datenbank)
tasks_db = []
task_id_counter = 1
@app.post("/tasks/", response_model=Task)
async def create_task(task: Task):
global task_id_counter
task.id = task_id_counter
task.created_at = datetime.now()
task_id_counter += 1
tasks_db.append(task)
return task
@app.get("/tasks/", response_model=List[Task])
async def get_tasks(completed: Optional[bool] = None):
if completed is None:
return tasks_db
return [t for t in tasks_db if t.completed == completed]
@app.get("/tasks/{task_id}", response_model=Task)
async def get_task(task_id: int):
task = next((t for t in tasks_db if t.id == task_id), None)
if not task:
raise HTTPException(status_code=404, detail="Task not found")
return task
@app.put("/tasks/{task_id}", response_model=Task)
async def update_task(task_id: int, task_update: Task):
task = next((t for t in tasks_db if t.id == task_id), None)
if not task:
raise HTTPException(status_code=404, detail="Task not found")
task.title = task_update.title
task.description = task_update.description
task.completed = task_update.completed
return task
@app.delete("/tasks/{task_id}")
async def delete_task(task_id: int):
global tasks_db
tasks_db = [t for t in tasks_db if t.id != task_id]
return {"message": "Task deleted"}Integration mit der Datenbank
FastAPI funktioniert hervorragend mit SQLAlchemy:
from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./tasks.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
class TaskModel(Base):
__tablename__ = "tasks"
id = Column(Integer, primary_key=True, index=True)
title = Column(String, index=True)
description = Column(String)
completed = Column(Boolean, default=False)
Base.metadata.create_all(bind=engine)
@app.post("/tasks/", response_model=Task)
async def create_task(task: Task, db: Session = Depends(get_db)):
db_task = TaskModel(**task.dict(exclude={'id'}))
db.add(db_task)
db.commit()
db.refresh(db_task)
return db_taskAuthentifizierung und Sicherheit
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from passlib.context import CryptContext
from jose import JWTError, jwt
from datetime import datetime, timedelta
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
def create_access_token(data: dict):
to_encode = data.copy()
expire = datetime.utcnow() + timedelta(minutes=30)
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid credentials"
)
access_token = create_access_token(data={"sub": user.username})
return {"access_token": access_token, "token_type": "bearer"}
async def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise HTTPException(status_code=401)
return username
except JWTError:
raise HTTPException(status_code=401)
@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
return {"username": current_user}Testen
FastAPI macht das Testen einfach:
from fastapi.testclient import TestClient
client = TestClient(app)
def test_create_task():
response = client.post(
"/tasks/",
json={"title": "Test task", "description": "Description"}
)
assert response.status_code == 200
assert response.json()["title"] == "Test task"
def test_get_tasks():
response = client.get("/tasks/")
assert response.status_code == 200
assert isinstance(response.json(), list)Leistung: Zahlen und Fakten
Laut TechEmpower Benchmarks (2026):
Framework | Anfragen pro Sekunde | Produktivität |
|---|---|---|
FastAPI | ~60,000 | ⭐⭐⭐⭐⭐ |
Django Ninja | ~40,000 | ⭐⭐⭐⭐ |
Django + gunicorn | ~10,000 | ⭐⭐⭐ |
🚀 Fazit: FastAPI kann 6-mal mehr Anfragen bei gleicher Auslastung verarbeiten!
In Kodike Hier findest du detaillierte Kurse zu Python, FastAPI, Django und anderen modernen Technologien. Wir vermitteln Programmierkenntnisse in der Praxis – mit realen Projekten und verständlichen Erklärungen.
🚀 Schließen Sie sich unserem Telegram-Kanal - Hier gibt es eine freundliche Entwickler-Community, nützliche Materialien, Code-Analysen und Antworten auf Fragen. Wir helfen Ihnen, ein gefragter Spezialist zu werden!
Beginnen Sie Ihre Programmierreise mit Kodik - lernen Sie bequem, schnell und effizient!
