Test: 13 Python-Webframeworks verglichen

Wenn Sie eine Webanwendung entwickeln und Python als Sprache für die Erstellung ausgewählt haben, ist dies ein kluger Schachzug. Pythons Entwicklungsreife, robuste Bibliotheken und die breite Akzeptanz in der Praxis haben dazu beigetragen, dass Python für die Webentwicklung kein Problem darstellt.

Jetzt kommt der schwierige Teil: Wählen Sie eines der vielen verfügbaren Python-Webframeworks aus. Es ist nicht nur so, dass die Anzahl weiter wächst, es kann auch schwierig sein, diejenige zu finden, die am besten zu Ihrem Anwendungsfall passt. Wenn Sie eine schnelle und fehlerhafte REST-API erstellen, benötigen Sie nicht annähernd die für eine vollständige benutzerbezogene Anwendung mit Benutzeranmeldungen, Formularüberprüfungen und Upload-Verarbeitung erforderlichen Installationen und Verkabelungen.

Zugehöriges Video: Erstellen einer einfachen Web-App mit Python und Flask

In dieser Zusammenfassung werden 13 der am weitesten verbreiteten Python-Webframeworks untersucht. Wir werden feststellen, welche Arten von Webanwendungen für die Erstellung am besten geeignet sind, und untersuchen, wie sie sich in diesen sechs Bereichen gegeneinander stapeln:

Installation: Wie einfach oder unkompliziert das Einrichten des Frameworks ist - Projekte, die keine formale Installation erfordern (es kann einfach als enthaltenes Modul in ein vorhandenes Projekt eingefügt werden), für den Start nur eine minimale Boilerplate benötigen oder mit einer Art geliefert werden von vorkonfigurierten Setup erhalten zusätzliche Punkte.

Dokumentation: Nahezu jedes anständige Python-Projekt verfügt über eine Dokumentation, die das Setup durchläuft, grundlegende Anwendungsfälle veranschaulicht und Details zu den APIs bereitstellt. Hier geben wir Frameworks, die zeigen, wie eine gesamte App als Teil des Tutorials erstellt wird, allgemeine Rezepte oder Entwurfsmuster enthalten und ansonsten über die Pflicht hinausgehen (z. B. indem wir Details zur Ausführung der App bereitstellen) Framework unter einer Python-Variante wie PyPy oder IronPython).

Verwaltung: Dies ist eine relative Punktzahl, die angibt, wie viel Arbeit zum Konfigurieren und Verwalten des Frameworks erforderlich ist. Minimale Frameworks erzielen hier standardmäßig eine höhere Punktzahl.

Native Funktionen: Wie viele Batterien sind enthalten? Höhere Punktzahlen gehen an Frameworks, die native Unterstützung für Internationalisierung, HTML-Vorlagen und eine Datenzugriffsschicht bieten. Punkte gehen auch an Frameworks, die die kürzlich eingeführte native Unterstützung von Python für asynchrone E / A-Vorgänge nativ nutzen.

Sicherheit: Frameworks, die native Sicherheitsmaßnahmen wie CSRF-Schutz (Cross-Site Request Forgery) und Sitzungsverwaltung mit verschlüsselten Cookies bieten, erhalten höhere Noten.

Skalierbarkeit: Die meisten Python-Frameworks können Projekte wie Gevent oder Gunicorn verwenden, um im Maßstab ausgeführt zu werden. Hier sehen wir uns Funktionen an, die dem Framework eigen sind und die Skalierbarkeit fördern, wie Ausgabe und Seitenfragment-Caching.

Wenn Sie neugierig auf Leistungsbenchmarks sind, werfen Sie einen Blick auf die laufenden Testreihen von TechEmpower, in denen mehrere Webframeworks für verschiedene Aufgaben mit Code und Methoden verglichen werden, die auf GitHub veröffentlicht und einer ständigen Neubewertung unterzogen werden. Nicht alle Frameworks in dieser Diskussion werden dort analysiert, aber es ist möglich, ein gutes Gefühl dafür zu bekommen, welche Frameworks unter welchen Belastungen am besten funktionieren.

Wir werden uns insgesamt 13 Frameworks ansehen. Fünf davon - CubicWeb, Django, Web2py, Weppy und Zope2 - verwenden den Ansatz „Küchenspüle“ und enthalten fast alle Funktionen, die Sie sich für eine Webanwendung vorstellen können. Die verbleibenden acht Frameworks - Bottle, CherryPy, Falcon, Flask, Pyramid, Tornado, Web.py und Wheezy.web - bieten eine minimalistischere Sichtweise, handeln Masse und Vollständigkeit für Einfachheit und Leichtigkeit.

Beginnen wir mit den Schwergewichten.

Schwergewichtige Python-Webframeworks

CubicWeb

CubicWeb wird als "Semantic Web Application Framework" bezeichnet, das die Wiederverwendung und das objektorientierte Design bevorzugt. Es ist ein faszinierendes System - wie Rick Grehan bereits 2011 feststellte -, das die Verwendung von Abstraktionen und wiederverwendbaren Codebausteinen namens „Cubes“ hervorhebt, für einige Entwickler jedoch möglicherweise zu abstrakt oder eigenwillig ist.

Cubes sind Softwarekomponenten mit einem Schema (Datenmodell), Entitäten (Programmierlogik) und Ansichten. Durch Zusammenstellen mehrerer Cubes, von denen jeder seine eigene Aufgabe ausführt, können Sie Softwareanwendungen erstellen, indem Sie Ihren eigenen Code und den Code anderer wiederverwenden.

Im Kern bietet CubicWeb ein grundlegendes Gerüst, das von jeder Web-App verwendet wird: ein „Repository“ für Datenverbindungen und Speicherung; eine „Web-Engine“ für grundlegende HTTP-Anforderungs- / Antwort- und CRUD-Aktionen; und ein Schema zum Modellieren von Daten. All dies wird in Python-Klassendefinitionen beschrieben. Um Instanzen von CubicWeb einzurichten und zu verwalten, arbeiten Sie mit einem Befehlszeilentool, das dem für Django verwendeten ähnlich ist.

CubicWeb scheint die native asynchrone Funktionalität von Python 3 nicht zu verwenden. Ein Umweg, um Async einzuschließen, besteht darin, das Modul cubicweb.pyramid zu verwenden, um das Pyramid-Framework als Webserver zu verwenden, und auf einen Zweig von Pyramid zuzugreifen, der asynchrone Konstruktionen verwendet. Aber alles, was einfacher ist, scheint vorerst unerreichbar.

Um persistente Daten in einer CubicWeb-App abzurufen oder zu bearbeiten, verwenden Sie RQL (Relation Query Language), die eine vage SQL-ähnliche Syntax verwendet, jedoch dem SparQL des W3C nachempfunden ist. Die Rechtfertigung von CubicWeb hierfür ist wiederum die Abstraktion: RQL bietet eine stark entkoppelte Route, um verschiedene Datenquellen miteinander zu verknüpfen. Durch die manuelle Erstellung von Abfragen als Zeichenfolgen wird es für Entwickler, die an ORMs gewöhnt sind, wahrscheinlich veraltet sein.

Es gibt andere Hindernisse für die Verwendung von CubicWeb. Zum einen kann die Einrichtung problematisch sein. Da CubicWeb viele Abhängigkeiten aufweist, ist es am besten, pip installsie alle abzurufen. Möglicherweise müssen Sie auch einige manuelle Anpassungen an der lokalen Umgebung vornehmen. Dies steht in krassem Gegensatz zu anderen Frameworks, bei denen nur das Ausführen pip installoder Ablegen des Framework-Codes in einem Unterordner eines anderen Projekts erforderlich ist.

Ein weiteres potenzielles Problem ist das Fehlen einer nativen Template-Engine. Das Generieren von HTML bleibt dem Entwickler überlassen. Sie können dies überwinden, indem Sie ein Template-System eines Drittanbieters wie Jinja2 verwenden oder sich für einen Cube entscheiden, der Tools für Web-Benutzeroberflächen wie das Boostrap-HTML-Framework bereitstellt.

Ein langjähriges Problem mit CubicWeb - der Mangel an Python 3-Unterstützung - wurde behoben. Ab Juni 2016 und Version 3.23 landete die Python 3-Unterstützung in CubicWeb, mit Ausnahme von Modulen wie Twisted, die selbst nicht vollständig portiert sind.

Wie Web2py bezeichnet CubicWeb seine ausführliche Dokumentation als "das Buch". Es braucht Zeit, um den ungewöhnlichen Ansatz von CubicWeb zu erläutern, zeigt, wie einige grundlegende Anwendungen erstellt werden, enthält API-Referenzen und ist im Allgemeinen sehr bemüht, spezifisch zu sein.

Django

In den zehn Jahren und Veränderungen seit dem Erscheinen von Django hat es sich zu einem der am weitesten verbreiteten Frameworks von Python für die Erstellung von Webanwendungen entwickelt. Django wird mit fast jeder Batterie geliefert, die Sie möglicherweise benötigen. Daher ist es eher für die Erstellung großer als für kleine Anwendungen geeignet.

Zugehöriges Video: Erstellen einer einfachen Website mit Django

Nachdem Django viele Jahre in Version 1.x gesessen hatte, machte er kürzlich einen Versionsstoß links vom Dezimalpunkt. Die größte Änderung in Django 2.0 ist, dass das Framework jetzt nur mit Python 3.4 und höher funktioniert. Idealerweise sollten Sie Python 3.x trotzdem verwenden. Der einzige Grund, den 1.x-Zweig von Django zu verwenden, besteht darin, dass Sie mit einer alten Version von Python nicht weiterkommen.

Ein wesentlicher Teil der Attraktivität von Django ist die Bereitstellungsgeschwindigkeit. Da es so viele Teile enthält, die Sie für die Entwicklung einer durchschnittlichen Webanwendung benötigen, können Sie sich schnell bewegen. Routing, URL-Analyse, Datenbankkonnektivität (einschließlich ORM), Formularüberprüfung, Angriffsschutz und Vorlagen sind integriert.

Sie finden Bausteine ​​für die gängigsten Webanwendungsszenarien. Die Benutzerverwaltung ist beispielsweise auf den meisten Websites zu finden, daher bietet Django sie als Standardelement an. Anstatt ein eigenes System zum Verfolgen von Benutzerkonten, Sitzungen, Kennwörtern, Anmeldungen / Abmeldungen, Administratorrechten usw. erstellen zu müssen, verfügt Django über diese Funktionen von Haus aus. Sie können unverändert verwendet oder erweitert werden, um neue Anwendungsfälle mit minimalem Arbeitsaufwand zu erfassen.

zope.formlib 1. Kern ist BSD; einige Komponenten LGPLv3. 2. Verfügbar über; separat installiert, aber im Rahmen des Projekts unterstützt. 3. Verfügbar über eine Drittanbieter-Erweiterung.
  CubicWeb Django Web2py Weppy Zope2
Lizenz LGPL BSD LGPLv3 BSD / LGPLv3 [1] Zope Public License
Natives HTML-Template-System Ja Ja Ja Ja Ja
Native ORM / Datenverwaltung Ja Ja Ja Ja Ja
Erweiterungsbibliothek Ja Ja Ja Ja Ja
Formularvalidierung Ja Ja Ja Ja Ja [2]
Standortübergreifender Schutz vor Fälschungen Ja Ja Ja Ja Ja
Benutzerverwaltung / rollenbasierter Zugriff Ja Ja Ja Ja Ja
Python 3-Unterstützung Ja Ja Nein Ja Nein
Schemamigrationen für Datenmodelle Ja Ja Ja Ja Nein
Antwort-Caching Nein Ja Ja Ja Ja
Unterstützung bei der Internationalisierung Ja Ja Ja Ja Ja
Native WebSockets-Unterstützung Nein Nr. 3] Ja Nein Nein
Interaktive Entwicklungsumgebung Ja Nein Ja Nein Ja

Django verfügt über vernünftige und sichere Standardeinstellungen, die Ihre Webanwendung vor Angriffen schützen. Wenn Sie eine Variable in eine Seitenvorlage einfügen, z. B. eine Zeichenfolge mit HTML oder JavaScript, wird der Inhalt nur dann wörtlich gerendert, wenn Sie die Instanz der Variablen explizit als sicher festlegen. Dies allein reduziert viele häufig auftretende Probleme mit Cross-Site-Scripting. Wenn Sie eine Formularvalidierung durchführen möchten, können Sie alles verwenden, vom einfachen CSRF-Schutz bis hin zu umfassenden Feld-für-Feld-Validierungsmechanismen, die detaillierte Fehlerrückmeldungen zurückgeben.

Ein so umfangreiches und umfassendes Feature-Set wie das von Django wäre ohne eine solide Dokumentation nicht besonders gut. Die Dokumentationsseite von Django befasst sich aus verschiedenen Blickwinkeln mit allen Aspekten des Frameworks. Arbeiten Sie mit Python 3 oder anderen Sprachvarianten, machen Sie die Sicherheit richtig, implementieren Sie allgemeine Webanwendungskomponenten (wie Sitzungen oder Paginierung) und erstellen Sie Sitemaps - alles wird behandelt. Die APIs für jede Ebene der Anwendung - Modell, Ansicht und Vorlage - werden ebenfalls ausführlich beschrieben.

Mit großer Kraft geht jedoch auch eine große Komplexität einher. Django-Anwendungen haben den Ruf, kopflastig zu sein und viele bewegliche Teile zu haben. Selbst eine einfache Django-App mit nur wenigen Routen erfordert eine Menge Konfiguration, um zum Laufen zu kommen. Wenn es Ihre Aufgabe ist, nur ein paar einfache REST-Endpunkte einzurichten, ist Django mit ziemlicher Sicherheit übertrieben.

Django hat auch seine Macken. Beispielsweise können Seitenvorlagen keine aufrufbaren Dateien verwenden. Beispiel: Sie können {{user.name}}als Komponente in einer Vorlage übergeben, jedoch nicht {{user.get_name()}}. Dies ist eine der Möglichkeiten, mit denen Django sicherstellt, dass Vorlagen nicht versehentlich böse Dinge tun, aber diese Einschränkungen können erschütternd sein, wenn Sie nicht darauf vorbereitet sind. Es gibt zwar Problemumgehungen, diese beeinträchtigen jedoch tendenziell die Leistung.

Djangos Kern ist synchron. Eine Möglichkeit, asynchrones Verhalten hinzuzufügen, ist das Django Channels-Projekt. Dieses Projekt, ein offizielles Django-Add-On, fügt Django eine asynchrone Behandlung für Verbindungen und Sockets hinzu, wobei die Programmiersprachen von Django erhalten bleiben.

Web2py

In der Ruby-Welt ist Ruby on Rails das De-facto-Webframework. Der Informatikprofessor der DePaul University, Massimo Di Pierro, wurde von Rails inspiriert, ein Webframework in Python zu erstellen, das ähnlich einfach einzurichten und zu bearbeiten war. Das Ergebnis ist Web2py.

Die größte Attraktion von Web2py ist die integrierte Entwicklungsumgebung. Wenn Sie eine Instanz von Web2py einrichten, erhalten Sie eine Weboberfläche, im Wesentlichen einen Online-Python-Anwendungseditor, über den Sie die Komponenten der App konfigurieren können. Dies bedeutet normalerweise das Erstellen von Modellen, Ansichten und Controllern, die jeweils über Python-Module oder HTML-Vorlagen beschrieben werden. Einige Beispiel-Apps werden standardmäßig mit Web2py geliefert. Sie können diese auseinander nehmen, um zu sehen, wie sie funktionieren, oder sie als Startervorlagen verwenden, um Ihre eigenen Apps zu erstellen.

Entwickler stellen Web2py normalerweise bereit, indem sie einfach den Quellcode herunterladen und diesen verwenden. Für weniger technische Benutzer unter Windows oder MacOS bieten die Entwickler von Web2py Versionen an, die im Wesentlichen eigenständige Server sind. Laden Sie eine dieser Versionen herunter, entpacken Sie sie und führen Sie sie aus. Sie verfügen über einen lokalen Webserver mit einer vorkonfigurierten Kopie von Web2py. Dies ist eine gute Möglichkeit, eine Web2py-App zu erstellen, die dann bereitgestellt werden kann anderswo nach Bedarf.

Die Weboberfläche von Web2py wurde mit Bootstrap 2.16.1 erstellt, ist also augenschonend und einfach zu navigieren. Der In-Browser-Editor ist kein Ersatz für eine vollständige IDE, verfügt jedoch über hilfreiche Hilfsmittel wie Zeilennummerierung und Hervorhebung der Python-Syntax (einschließlich automatischer Einrückung). Ebenfalls enthalten ist eine schnelle Weboberfläche zur Python-Shell, sodass Sie bei Bedarf über die Befehlszeile mit Web2py interagieren können - ein nettes Zugeständnis an Experten.

Das in Web2py verwendete Datenabstraktionssystem funktioniert etwas anders als Djangos ORM und andere davon inspirierte ORMs (wie Peewee). Diese Systeme verwenden Python-Klassen, um Modelle zu definieren, wobei Sie in Web2py Konstruktorfunktionen verwenden, um Modelle define_tablezu instanziieren. Die meisten dieser Unterschiede wirken sich wahrscheinlich nur auf Personen aus, die bereits Erfahrung mit dem einen haben und anfangen, das andere zu verwenden. Sie sind für Neuankömmlinge ungefähr genauso komplex. Es ist unwahrscheinlich, dass Sie Probleme haben, Web2py an einen Datenanbieter anzuhängen, da es mit fast allen wichtigen vorhandenen Datenbanken kommuniziert.

Eine wirklich nützliche datenbankbezogene Funktion ist die Möglichkeit, ein Diagramm der Modelle zu erstellen, um besser zu visualisieren, wie Ihre Modelle zueinander in Beziehung stehen. Sie müssen jedoch die pygraphviz-Bibliothek installieren, um diese Funktion zu aktivieren.

Web2py bietet viele andere professionelle Komponenten: Internationalisierungsfunktionen, mehrere Caching-Methoden, Zugriffskontrolle und Autorisierung und sogar Front-End-Effekte (z. B. eine Datumsauswahl in Formularen) über die integrierte Unterstützung für jQuery und AJAX. Hooks für externe und interne Middleware sind ebenfalls enthalten, obwohl Sie Middleware nicht verwenden dürfen, um die Kernfunktionen von Web2py zu ersetzen.

Eine wesentliche Einschränkung von Web2py besteht darin, dass es nur mit Python 2.x kompatibel ist. Zum einen bedeutet dies, dass Web2py die asynchrone Syntax von Python 3 nicht verwenden kann. Wenn Sie sich auf externe Bibliotheken verlassen, die exklusiv für Python 3 verfügbar sind, haben Sie kein Glück. Es wird jedoch daran gearbeitet, Web2py Python 3 kompatibel zu machen, und es ist zum Zeitpunkt dieses Schreibens fast abgeschlossen.

Kein Wunder, dass die Dokumentation von Web2py als "das Buch" bezeichnet wird. Erstens deckt es eine erstaunliche Menge an Material zu Web2py, Python und den für beide verwendeten Bereitstellungsumgebungen ab. Zweitens ist es in einem leicht zugänglichen, narrativen Stil geschrieben. Drittens wird ausführlich über gängige Anwendungserstellungsszenarien gesprochen. Es gibt zum Beispiel ein ganzes Kapitel über die Verwendung von jQuery (im Lieferumfang von Web2Py enthalten) zum Erstellen von AJAX-Anwendungen.

Weppy

Weppy fühlt sich wie eine halbe Strecke zwischen der minimalen Einfachheit von Flask und der Vollständigkeit von Django an. Während die Entwicklung einer Weppy-App die Unkompliziertheit von Flash aufweist, bietet Weppy viele Funktionen in Django, wie Datenschichten und Authentifizierung. Daher eignet sich Weppy für Apps, die von extrem einfach bis bescheiden anspruchsvoll reichen.

Auf den ersten Blick ähnelt der Weppy-Code stark dem Flask- oder Bottle-Code. Es sind nur wenige Anweisungen erforderlich, um eine einfache Website mit nur einer Route zum Laufen zu bringen. Routen können durch Funktionsdekoratoren (auf einfache Weise) oder programmgesteuert beschrieben werden, und die Syntax hierfür ist eng mit Flask / Bottle verknüpft. Das Templating funktioniert ungefähr gleich, abgesehen von geringfügigen Abweichungen in der Syntax.

Weppy kontrastiert mit diesen anderen Frameworks, indem es einige Funktionen enthält, die nur als Plug-Ins oder Add-Ons enthalten sind. Beispielsweise verfügen weder Flask noch Bottle über ein integriertes ORM oder ein Datenverwaltungssystem. Weppy enthält ein ORM, das jedoch eher auf dem pyDAL-Projekt als auf der weitaus populäreren SQLAlchemy basiert. Weppy unterstützt sogar Schemamigrationen, die Django im Rahmen seines ORM unterstützt (auch das Migrationssystem von Django ist wesentlich automatisierter). Während Weppy über einen Erweiterungsmechanismus verfügt, ist die Liste der offiziell genehmigten Add-Ons winzig und weitaus kleiner als der Katalog der Erweiterungen für Flask.

Leichtere Frameworks wie Weppy werden häufig zum Erstellen von RESTful-APIs verwendet, und Weppy ist zu diesem Zweck mit praktischen Funktionen ausgestattet. Wenn Sie einen @ service-Dekorateur auf eine Route setzen, werden die von Ihnen zurückgegebenen Daten automatisch in JSON oder XML Ihrer Wahl formatiert.

Weppy enthält andere Funktionen, die eher einem größeren Framework entsprechen, aber ohne großen Aufwand implementiert sind. Beispiele: Datenvalidierungsmechanismen, Formularverarbeitung, Antwort-Caching und Benutzervalidierung. In all diesen Fällen verfolgt Weppy einen „gerade genug“ Ansatz. Die bereitgestellten Funktionen sind nicht so vollständig wie in einem Django-Framework, aber ein Entwickler muss nicht viel Arbeit investieren, um sie nützlich zu machen, und sie können jederzeit nachträglich erweitert werden.

Ein weiteres Merkmal von Weppy, das normalerweise mit einem schwereren Framework verbunden ist, ist die Unterstützung der Internationalisierung. Zeichenfolgen in Vorlagen können gemäß den mit der Anwendung bereitgestellten Gebietsschemadateien übersetzt werden, bei denen es sich um einfache Python-Wörterbücher handelt. Die Wahl der Sprache kann auch durch Parsen der Browseranforderung (dh des HTTP-Headers "Accept-Language") oder durch Binden einer Übersetzung an eine bestimmte Route festgelegt werden.

Die Dokumentation von Weppy hat den gleichen Geschmack wie das Framework selbst. Es ist sauber, lesbar und geschrieben, um von Menschen konsumiert zu werden. Abgesehen von dem üblichen App-Beispiel „Hallo Welt“ enthält es ein schönes Tutorial, mit dem Sie ein Microblogging-System als Starterprojekt erstellen können.

Langfristige Pläne für Weppy beinhalten die Unterstützung von Async und Sockets als erstklassige Einheiten auf niedriger Ebene. Die Entwickler von Weppy planen, diese Funktionen in Version 2.0 einzuführen und dann Python 3.7 oder besser für alle zukünftigen Versionen von Weppy zu benötigen.

Scorecard Native Fähigkeit (20%) Management (20%) Installation (20%) Dokumentation (20%) Sicherheit (10%) Skalierbarkeit (10%) Gesamtpunktzahl (100%)
Flasche 0.12 8 10 10 8 7 7 8.6
CherryPy 17.0.0 7 9 9 9 8 8 8.4
CubicWeb 3.26.4 10 8 7 10 9 7 8.6
Django 2.1 10 8 8 10 10 10 9.2
Falcon 1.4.1 7 10 8 8 7 7 8.0
Kolben 1.0.2 8 9 8 9 8 8 8.4
Pyramide 1.9.2 8 8 8 10 9 7 8.4
Tornado 4.3 8 9 9 8 8 7 8.3
Web.py 0.39 8 8 10 8 9 8 8.5
Web2py 2.16.1 10 9 7 10 9 8 8.9
Weppy 1.2.11 10 8 9 9 10 9 9.1
Wheezy.web 0.1.485 9 9 8 8 8 8 8.4
Zope2 2.13.24 10 8 7 9 9 9 8.6