Schnelle Webapplikationen
Artikel erschienen in Swiss IT Magazine 2007/03
Schneller Webapplikationen und Webseiten produzieren zu können, ist der Wunsch jedes Entwicklers. Dass dies nicht nur mit Ruby und Ruby on Rails (RoR) geht, beweisst das High-level-Framework Django.
Auf den ersten Blick könnte der Eindruck entstehen, Django (benannt nach dem Jazz-Gitarristen Django Reinhardt) sei ein RoR-Klon. Dies ist aber falsch, auch wenn gewisse Parallelen bezüglich Architektur existieren.
Django entstand etwa zeitgleich wie RoR aus der Arbeit an einem Real-Life-Projekt, dem Online-Auftritt einer Lokalzeitung im US-Bundesstaat Kansas. Es setzt ebenfalls auf bekannte Konzepte aus dem Bereich der objektorientierten Programmierung wie MVC oder DRY, auch wenn es diesen Konzepten nicht so strikt folgt, wie es viele andere Frameworks tun.
Im Unterschied zu ähnlichen Frameworks wie dem ebenfalls in Python geschriebenen TurboGears, das unter anderem auf CherryPy oder Kid basiert, wurden sämtliche Komponenten von Django speziell für das Framework entwickelt. Dies ist weniger ein Fall eines ausgeprägten Not-Invented-Here-Syndroms als eine Auswirkung der Entwicklungsgeschichte: 2003, als mit der Entwicklung von Django begonnen wurde, waren die nötigen Werkzeuge entweder noch nicht vorhanden oder besassen nicht die nötige Qualität. Als Anwender profitiert man jedenfalls davon, dass die Komponenten problemlos zusammenarbeiten, während sich beispielsweise bei TurboGears ab und zu doch der Leim zwischen den verschiedenen Einzelteilen bemerkbar macht.
Komplett verzichtet wurde auf die Beigabe eines AJAX-Framework, wie dies RoR mit Scriptacolous oder TurboGears mit MochiKit tun. So muss man auf vordefinierte Funktionen zur Generierung von AJAX-Actions verzichten, kann dafür auf das AJAX-Framework setzen, das einem am besten gefällt. Zudem besteht etwas weniger das Risiko, überall AJAX zu verwenden, auch dort, wo es eigentlich nicht angebracht wäre.
Wie Ruby on Rails bietet Django eine hohe Abstraktion. Dies bedeutet, dass deutlich weniger Code geschrieben werden muss, weil Django einerseits über einen Grossteil der benötigten Funktionen wie Sessions, Caching, Formular-Generierung und
-Validierung verfügt und andererseits viele Aufgaben selbstständig ausführt. So braucht man beispielsweise kaum selber SQL zu schreiben, da die Datenbanken direkt mit Scripts aus den Datenmodellen erzeugt und Object Relational Mapping zur Verwaltung und Abfrage von Daten verwendet werden. SQL braucht man erst dann zu schreiben, wenn die benötigte Funktionalität vom
O/R Mapper nicht abgedeckt wird, beispielsweise bei komplizierten Subqueries oder Aggregatsfunktionen. Damit geht Django auch einen anderen Weg als Ruby on Rails, bei dem die Datenbank das Modell darstellt und das Framework mittels Introspektion die eigene Struktur ermittelt. Was einem besser gefällt, ist letztlich Geschmackssache.
Eine ganz besondere Funktion von Django ist die automatische Administrationsoberfläche. Sie wird wie die Datenbank automatisch aus den Datenmodellen generiert und stellt Formulare zum Anlegen, Bearbeiten und Löschen von Daten zur Verfügung. Die Struktur der Formulare wie die der Übersichtsseiten kann über simple Instruktionen im Datenmodell modifiziert oder zusätzliche Funktionen wie Filter oder Sortierungen eingefügt werden. Auf diese Weise kommen auch Anfänger, die bisher kein Python, dafür aber beispielsweise PHP können, innert weniger Stunden zu ansprechenden Resultaten.
Die Installation von Django ist, sofern man bereits Python und das RDBMS der Wahl (unterstützt werden PostgreSQL, SQLite 3, MySQL, Microsoft SQL Server und Oracle) zusammen mit den passenden Python-Modulen installiert hat, schnell erledigt. Django ist bereits Bestandteil etlicher Paketsammlungen und Linux-Distributionen, lässt sich aber auch einfach von Hand mit Hilfe der Setuptools installieren. Einen Webserver braucht man für Entwicklungszwecke nicht. Er wird von Django selber mitgebracht, sollte aber auf keinen Fall produktiv eingesetzt werden. Hier leisten Apache 2 mit mod_python oder lighttpd mit FastCGI deutlich bessere Arbeit.
Wie bei den meisten MVC-Frameworks besteht der erste Schritt zu einem funktionierenden Programm nicht in der Programmierung, sondern der Ausführung einiger administrativer Tätigkeiten. Dabei unterstützt einen das Django-Werkzeug django-admin.py, das sich unter anderem um die Erstellung von Projekten und Applikationen kümmert. Dabei werden die benötigten Konfigurationsdateien für Datenbankverbindung, Vorlagen-Konfiguration und Abbildung von URLs auf Views erzeugt. Das Projekt stellt eine Art Container um die verschiedenen Applikationen dar, die jeweils aus Model (models.py), View (views.py) und Controller (einer automatisch erzeugten API) bestehen.
Die Modelle bestehen aus Python-Klassen, die jeweils eine Datenbanktabelle repräsentieren. Die Tabellenspalten werden über Klassenvariablen definiert, deren Typ inklusive diversen Eigenschaften sowie Validierungsfunktionen von verschiedenen Modell-Klassen, die in die Klassenvariablen geladen werden, bestimmt werden. Daraus kann dann mit django-admin.py respektive dem projektabhängigen manage.py die Datenbank erzeugt werden. Ein Beispiel sieht man im Kasten «Modell für Buchkatalog», der ein Modell zur Speicherung eines Buchkatalogs enthält. Die Klasse Category verfügt über ein Feld zur Speicherung des Kategoriennamens, der später dazu verwendet wird, die Bücher zu kategorisieren. Die Klasse Book stellt das Modell zur Speicherung der Bücher bereit, das aus einer 1:n-Relation zum Modell Category sowie Feldern zur Speicherung von Titel, Autor und ISBN besteht.
Dies reicht Django bereits, um zusammen mit einer leeren Klasse Admin (siehe Modell Category) eine verwaltbare Administrationsoberfläche zu generieren. Wie bereits erwähnt, lässt sich diese über einfache Befehle in ihrer Funktionalität erweitern, was im Modell Book passiert ist. list_filter = ['category'] ermöglicht die Anzeige der Bücher nach Kategorie und list_display = ['title', 'author', 'isbn', 'category'] definiert die Attribute jedes Datensatzes, die auf der Übersichtsseite angezeigt werden sollen. Die beiden Screenshots auf Seite 48 zeigen den Unterschied zwischen Original und modifizierter Oberfläche.
Dies streift natürlich nur einen kleinen Teil der Möglichkeiten. So ist nicht nur die Abbildung von Relationen aller Art möglich, sondern auch umfangreichere Umgruppierungen und Umgestaltungen. Wem die bestehenden Fähigkeiten nicht reichen, kann natürlich auch von Hand die Vorlagen für die Administrationsumgebung modifizieren.
Die Ausgabe von Django ist ebenfalls elegant gelöst, auch wenn einem hier die Arbeit nicht komplett abgenommen wird. So muss man die View-Funktionen zur Datenbeschaffung und zum Laden der Templates selber schreiben, wird aber beispielsweise bei der Erzeugung von Formularen und deren Validierung unterstützt. Auch existieren vorbereitete Klassen, die die Generierung von RSS-Feeds zum Kinderspiel machen, ohne dass man auch nur ein bisschen XML schreiben muss.
Die Template Engine ist sehr leistungsfähig und bietet viele Funktionen sowie eine eingängliche Syntax, die vor allem PHP-Entwicklern, die auf Smarty setzen, bekannt sein dürfte. So kennt auch die Template Engine von Django Modifier, die sich an Variablen anhängen lassen, um deren Inhalte zu modifizieren.
Wer einen detaillierteren Blick auf Django werfen möchte, findet auf der Webseite www.djangoproject.com nicht nur ein Tutorial, mit dem man in wenigen Stunden Django kennenlernen und eine erste einfache Applikation entwickeln kann, sondern auch detaillierte Informationen zu allen Aspekten von Django. Parallel dazu entsteht unter www.djangobook.com ein komplettes Buch zur Applikationsentwicklung mit Django mit hilfreichen Anwenderkommentaren. Von den Beiträgen der aktiven Community kann man unter anderem im Rahmen eines Wiki und aggregierten Blogs auf der Django-Webseite profitieren.