Python hat sich längst als Sprache für serverseitige Frameworks etabliert und unterstützt dabei Projekte jeder Größenordnung und sämtliche Use Cases. Allerdings ist Python bisher auch eher auf das Backend beschränkt - bislang gibt es noch keine wirkliche "Kultur", Python für Frontend- und Client-seitigen Code zu nutzen. Das liegt auch daran, dass die bisherigen Versuche, Python am Frontend in JavaScript zu transpilieren oder es über WebAssembly auszuführen, eher klobig und bisweilen primitiv umgesetzt wurden.
Doch es gibt neue Hoffnung: Einige moderne Web Frameworks ermöglichen es, deklarativen Python-Code im Backend zu schreiben, der programmatisch Frontend-Code erzeugt. Sie können Python-Objekte verwenden, um HTML-Entitäten und deren JavaScript-gestütztes Verhalten zu beschreiben - und dann das Framework diese Objekte generieren lassen, wenn sie an den Client geliefert werden.
3 Python Web Frameworks
Die folgenden drei Web Frameworks für Python folgen exakt diesem Paradigma. Jedes von ihnen ermöglicht es, Frontend-Code (HTML, CSS und JavaScript) durch Backend-Python-Code zu erzeugen. Die Frontend-Objekte werden also durch das Python-Objektmodell dargestellt.
Die Macher dieses Web Frameworks versprechen, "Webanwendungen mit nichts anderem als Python zu erstellen". Allerdings können Sie dabei auch auf Low-Code-Tools mit Drag-and-Drop-Funktion zurückgreifen. Am Ende steht eine vollwertige Webanwendung mit einem interaktiven, JavaScript-basierten Frontend und einem Python-basierten Backend.
Anvil bietet dabei zwei grundlegende Ansätze:
Der Cloud Service ist in verschiedenen Preisstufen erhältlich und bietet visuelle Build-Tools sowie eine Reihe von Hosting-Optionen.
Die quelloffene Laufzeitumgebung von Anvil enthält keinen visuellen Designer, ermöglicht aber Anwendungen mit manuell generiertem Code zu erstellen und auszuführen.
Anvil-Anwendungen bestehen grundsätzlich aus drei Komponenten:
der Benutzeroberfläche (manuell oder mit Low-Code-Tools erstellt),
dem clientseitigen Code (der von Python nach JavaScript transpiliert wird) und
dem serverseitigen Python-Code.
Der Anvil-Cloud-Editor generiert automatisch Backend- und Frontend-Code im Stil von Tools wie Qt Design Studio. Er kommt standardmäßig mit einigen Beispielen, etwa einer einfachen statischen Applikation ohne Back-End-Code, einem simplen Ticket-System und einem vollständigen Online-Shop. Jedes dieser Beispiele kann als Template für Ihr eigenes Projekt dienen.
Darüber hinaus erhalten auch eine nützliche Auswahl vorgefertigter UI-Komponenten, die Sie in Ihre Webseiten einbinden können. Eine besonders praktische Komponente ist dabei ein Timer, der dafür sorgt, dass Code in bestimmten Intervallen ausgeführt wird - etwa, um Datenquellen nach Aktualisierungen abzufragen. Bei Bedarf können Sie auch Ihr eigenes HTML und eigene Komponenten erstellen. Datenquellen lassen sich über die Cloud hinzufügen und mit Komponenten verdrahten, so dass gängige CRUD-Applikationen sehr flott entstehen. Außerdem werden Code-Änderungen sofort auf den Anwendungsserver übertragen, was einen schnellen Entwicklungszyklus ermöglicht.
Bei den Elementen der Benutzeroberfläche handelt es sich im Wesentlichen um Instanzen von Python-Klassen, deren Ereignis-Handler über Klassenmethoden hinzugefügt werden. Über gut durchdachte allgemeine Methoden lassen sich auch programmatische Verhaltensweisen hinzufügen. Wenn Sie beispielsweise einen Event bei den Children eines Objects auslösen möchten, brauchen Sie dafür keinen Loop. Stattdessen nutzen Sie einfach die raise_event_on_children
-Methode für das Container-Objekt.
Standardmäßig wird der gesamte JavaScript-Code für eine Anvil-Site automatisch generiert, Sie können bei Bedarf aber auch Ihren eigenen Code schreiben. In diesem Fall sollten Sie darauf achten, dass dieser nicht mit dem Anvil-Code in Konflikt gerät. Zudem sind einige der Anvil-eigenen Abhängigkeiten etwas veraltet, zum Beispiel Bootstrap 3. Dieses Problem können Sie umgehen, indem Sie ein benutzerdefiniertes Theme erstellen - was nicht leider nicht trivial ist.
Dieses Framework kann nicht mit dem Design-Toolset von Anvil aufwarten, entspringt jedoch derselben Grundidee: Python-Code zu verwenden, um sowohl das Backend Ihres Web-Stacks zu coden als auch das Frontend programmatisch zu erzeugen - ohne dabei auf JavaScript zurückgreifen zu müssen.
Pynecone selbst verwendet sowohl Python als auch die (Long-term Support-Version der) Node.js-Laufzeitumgebung und kombiniert diese mit dem Bun JavaScript Library Manager. Sie müssen also Node installiert haben, bevor Sie das Framework mit dem Befehl pip install pynecone
ausführen können. Beachten sollten Sie dabei, dass der Pynecone-Stack besser unter Linux als unter Windows läuft - es sei denn, Sie verwenden Windows Subsystem for Linux.
Das Frontend einer Pynecone-Anwendung wird nach Next.js kompiliert, wobei jede Komponente einer Webseite mit Python-Objekten beschrieben wird. Viele gängige Komponenten sind bereits integriert - nicht nur so alltägliche Dinge wie Textlayouts oder Formularverarbeitung, sondern auch:
Data Display Objects wie Diagramme,
Feedback-Steuerelemente wie Alerts und Fortschrittsbalken sowie
Overlay-Objekte wie Modals und Tooltips.
Darüber hinaus lassen sich auch benutzerdefinierte React-Komponenten einbinden. Für die Anbindung an Datenquellen enthält Pynecone einen Data Layer (SQLAlchemy ORM).
Um UI-Komponenten anzupassen möchten, können die meisten gängigen Modifikationen, wie zum Beispiel CSS-Styling, als Argumente an den Object Constructor übergeben werden, anstatt eine Komponente per Subclassing zu ändern. Für alles andere gibt es benutzerdefiniertes HTML, aber eine Kombination aus den Built-Ins und ihren Optionen sollte für die große Mehrheit der gängigen Projekte ausreichen.
Wenn Sie hauptsächlich statische Websites erstellen, bringt Pynecone zudem eine praktische Funktion mit, mit der es sich auch als programmatisches Website-Generator-Tool empfiehlt - nämlich eine komplette Webseite in ein statisches Build zu exportieren.
Wie Pynecone ermöglicht auch JustPy, Webseitenelemente programmatisch zu erstellen - ohne interaktive Design-Tools. Was JustPy dabei in erster Linie von der Konkurrenz abhebt, ist sein effizientes und sinnvolles Objektmodell. Alle JustPy-Objekte können subklassifiziert und modifiziert werden - in der Dokumentation finden Sie diverse Beispiele.
Event-Handler für Elemente, wie etwa On-Click-Aktionen zu registrieren, erfordert nicht viel mehr als, eine Python-Funktion zu schreiben, die self
als erstes Argument (für das betreffende Objekt) annimmt. Standardmäßig unterstützt JustPy Frontend-Live-Updates über WebSockets, Sie können aber auch Ajax-Updates nutzen.
Für CSS nutzt JustPy Tailwind. Das können Sie bei Bedarf aber auch deaktivieren und durch ein anderes CSS-Framework ersetzen. HTML können Sie auch direkt einfügen. Ganze Seiten oder einzelne Objekte können auch zwischengespeichert werden, um sie wiederzuverwenden.
Ein weiteres herausragendes Merkmal von JustPy ist die Integration einer ganzen Reihe von Frontend-Präsentations-Frameworks - darunter:
Matplotlib,
Plotly,
Altair und
Bokeh.
So eignet sich JustPy gut, um Python-Code für Data-Science-Zwecke zu verpacken und über eine Weboberfläche darzustellen. Jedes Objekt, etwa ein Matplotlib-Plot, wird als JustPy-Objekt ausgeliefert, das der Objektsammlung einer beliebigen Seite hinzugefügt werden kann.
Allerdings enthält JustPy keinen ORM oder einen anderen Data Layer. Das ist kein großes Versäumnis, denn das lässt sich in jedem modernen Web Framework leicht nachträglich bewerkstelligen. Davon abgesehen gibt es bei diesem Framework auch kein direktes Äquivalent zu einem einfachen Template-System wie Jinja2 und keine Option für eine vollständig statische Website-Bereitstellung.
Welches Python Web Framework nutzen?
Zusammenfassend lässt sich festhalten:
Anvil besticht vor allem mit seinen Tools, um interaktive Benutzeroberflächen mit wenig oder gar keinem Code zu erstellen.
JustPy bietet hingegen eine kompakte Methode, um auszudrücken, wie Objekte erstellt werden und miteinander in Beziehung stehen.
Pynecone punktet vor allem mit dem Komfort, mit React-Komponenten und Next.js arbeiten zu können und ermöglicht darüber hinaus, generierte Seiten in statischem HTML zu rendern.
(fm)
Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.