Litestar sollte man sich einmal ansehen
(b-list.org)- Litestar ist ein unter den asynchronen Python-Web-Frameworks weniger bekannter Geheimtipp
- Dank schneller Skalierbarkeit und flexibler Architektur lässt es sich leicht in verschiedensten Projekten einsetzen
- Es bietet Datenmodellierung ohne Abhängigkeit von bestimmten Bibliotheken wie Pydantic
- Die SQLAlchemy-Integration ist hervorragend und bietet Stärken bei Datenbankanbindung und -verwaltung
- Mit praktischen eingebauten Funktionen für Authentifizierung, Caching, Logging, Monitoring usw. ist es sofort in der Praxis einsetzbar
Überblick über Litestar
- In den letzten Jahren haben async-first, auf Type Hints basierende Python-Web-Frameworks viel Aufmerksamkeit erhalten; unter ihnen wurde Litestar ausgewählt, um praktische Erfahrung damit zu sammeln
- Da Litestar in mehreren realen Projekten als Haupt-Framework eingesetzt wurde, ist die Überzeugung von dieser Entscheidung immer weiter gewachsen
- Viele Python-Webentwickler kennen Litestar noch nicht, daher stellt dieser Artikel seine wichtigsten Vorteile und Besonderheiten vor
Beispiele und Framework-Vergleich
-
Mit Litestar lässt sich auch eine sehr einfache Single-File-Webanwendung problemlos schreiben
- Ein Route-Decorator ist eine unabhängige Funktion, die nicht an ein App-Objekt gebunden ist
- Im Beispielcode wird bei einem Aufruf von
/greet?name=Bob„Hi, Bob!“ zurückgegeben - Fehlt ein Pflichtparameter, wird automatisch eine 400-Antwort geliefert
-
Anders als bestehende Python-Mikroframeworks wie Flask oder FastAPI hat Litestar strukturelle Eigenschaften, die sich bei Projekten unterschiedlichster Größen ganz natürlich erweitern lassen
- Bei Flask oder FastAPI sind Routing-Decoratoren an das App-Objekt gebunden, wodurch bei der Aufteilung auf mehrere Dateien Probleme mit zirkulären Imports entstehen können
- Meist muss man untergeordnete Route-Registries nutzen (bei Flask/Quart etwa Blueprints, bei FastAPI
APIRouterusw.), was die Einstiegshürde erhöhen oder strukturelle Änderungen erforderlich machen kann - Bei Litestar ist der Decorator jedoch eine unabhängige Funktion, sodass der Wechsel zwischen einer Ein-Datei-App und einer großen verteilten Struktur sehr schlank ausfällt
-
Dank der grundlegenden Architektur und Art der Dokumentation von Litestar lassen sich Konzepte wie Router und Funktionsgruppen schon sehr früh einführen, wodurch sich auch bei komplexen API-Strukturen leicht Konsistenz wahren lässt
- Dependency Injection, Berechtigungen und gemeinsam genutzte pfadbezogene Konfiguration sind Stärken seiner Composability
- Dieselbe Route kann mehrfach registriert werden, sodass sich je nach Umgebung Authentifizierung oder Abhängigkeiten unterschiedlich anwenden lassen
Datenmodellierung ohne Pydantic-Abhängigkeit
-
FastAPI und ähnliche Frameworks hängen bei Daten stark von Pydantic ab
- Pydantic ist stark bei typbasierter Datenvalidierung und Serialisierung, jedoch ist eine direkte Anbindung an ORMs (SQLAlchemy) schwierig
- In der Praxis ist es oft umständlich, SQLAlchemy-Modelle und Pydantic-Modelle jeweils getrennt zu schreiben
-
Litestar unterstützt nicht nur Pydantic, sondern allgemein verschiedene Typen wie dataclasses, msgspec, attrs, SQLAlchemy model
- Mit einem Serialization-Plugin-Protokoll ist die Erweiterbarkeit hoch
- Eine Funktion zur automatischen Extraktion von Datenübertragungsobjekten (DTOs) ist integriert, sodass Änderungen an der ursprünglichen Datenklasse automatisch im DTO berücksichtigt werden
- Auch das Ausschließen oder Einschließen einzelner Felder, Namenszuordnungen und DTOs für partielle Updates lassen sich einfach deklarieren
- Dadurch lassen sich doppelte Deklarationen von Modellfeldern und häufige Fehler bei manueller Synchronisierung vermeiden
Integration mit SQLAlchemy und Einführung in Advanced Alchemy
-
Das SQLAlchemy ORM ist faktisch der Standard für die Python-Datenbankanbindung
- Litestar bietet eine sehr starke Integration mit automatischer Serialisierung von SQLAlchemy-Schemata, DTO-Automatisierung, Session-Management-Plugins und kombinierten Plugins
-
Über die Bibliothek Advanced Alchemy (vom Litestar-Team gepflegt) werden die SQLAlchemy-Funktionen erweitert
- Sie bietet zahlreiche Funktionen zur Qualitätsverbesserung, darunter datenbankagnostische große Primärschlüssel, automatische Zeitstempel, UUID-Schlüssel, JSON-Typen, Alembic-Migrationsintegration sowie Seed/Export
- Besonders bemerkenswert ist die Unterstützung für Abstraktionen von Repository- und Service-Layern, die CRUD, Paginierung und weitere Repository-Funktionen automatisch bereitstellt
- In Frameworks, die anders als Django nur schwache strukturelle Leitlinien bieten, schafft dies eine Organisationsform, in der sich die Einführung eines Repository-/Service-Layers empfiehlt
Weitere Merkmale und eingebaute Unterstützungsfunktionen
- Litestar bietet intern auch ein Authentifizierungssystem (Guard-Funktionen, Middleware), Caching (stores), Logging, standardisierte Problemantworten, auf Prometheus/OpenTelemetry basierende Metriken sowie htmx-Unterstützung
- Anders als bei anderen Mikroframeworks ist es für bestimmte Funktionen nicht nötig, erst separate externe Bibliotheken zu suchen oder eigenes Glue Code zu schreiben
- Es bewahrt die Einfachheit eines „Mikroframeworks“, erlaubt aber zugleich, Erweiterungen oder Zusatzfunktionen bei Bedarf sofort zu nutzen
- Es ist weniger ein Ersatz für Django/Flask, sondern eher ein Konzept, das die Stärken von Frameworks anderer Sprachen wie Java Spring Boot (frühe Struktur, Komfort usw.) auf Pythonic-Art übernimmt
- Insgesamt ist es für praktische Python-Webentwicklung eine Option mit hoher Produktivität und strukturellen Vorteilen
Fazit
- Dank Asynchronität, typbasierter Entwicklung, flexibler Erweiterbarkeit, lockerer Datenmodellierung sowie hervorragendem ORM und eingebauten Funktionen entwickelt sich Litestar zu einem Framework, das sich Python-Webentwickler unbedingt einmal ansehen sollten
- Die wiederholte Nutzung in realen Projekten hat gezeigt, dass es auch in unterschiedlichen Projektumgebungen wie Startups eine hohe Produktivität und Wartbarkeit bietet
- Es bleibt zu hoffen, dass Entwickler Litestar bei der Planung ihres nächsten Python-Webprojekts als eine der Optionen in Betracht ziehen
2 Kommentare
Gibt es für das „zirkuläre Importproblem“ in Python nicht ohnehin eine recht klare Lösung? Es wirkt etwas schade, das als gravierendes Problem zu betrachten.
Hacker-News-Kommentare
@post("/route", exception_handlers={...})fühlt sich etwas sperrig an. Ich hoffe künftig auf bessere eingebaute Tools und Verbesserungen der Developer Experience@postformzu bauen, der die komplette Formularbehandlung übernimmt?