Python und Django

Django

Jetzt sind es schon einige Wochen, seit meiner ersten Begegnung mit Python und dem Django Framework. Nachdem ich das ganze erstmal "sacken lassen" musste habe ich letzte Woche noch mal einen neuen Versuch gewagt.

Buch: Hetland - Beginning Python

Das Buch Beginning Python von Magnus Lie Hetland kann ich uneingeschränkt empfehlen. Ich habe es jetzt bis zur Hälfte durchgelesen und damit alle Sprachgrundlagen gelernt, in der zweiten Hälfte werden diverse Projekte vorgestellt, um das gelernte an Hand von Beispielen zu vertiefen - ich bin schon gespannt.

Nachdem ich letzte Woche schon einen Lighttpd auf meinem MacBook Pro installiert habe um Django endlich mal mit einem richtigen Webserver zu betreiben konnte es dann losgehen. Ich habe zum Spaß erstmal angefangen eine bestehende Webseite von PHP auf Python umzustellen - nichts großes, eigentlich nur mit minimalen CMS Anforderungen, aber man muss ja klein Anfangen. Auf jeden Fall ist es so, dass ich inkl. Nachschlagen in der Django Dokumentation und Lesen im Django Book nicht mal einen Arbeitstag gebraucht habe um die Seite zu Portieren (Ausgenommen einer Bildergalerie, die ich mir noch vornehmen muss).

Während ich dabei war habe ich mir ein paar Notizen gemacht und interessant sind wohl die folgenden Werte:

Das heißt nach ca. 3 Stunden war die Grundfunktionalität der Seite auf Django portiert. Danach folgten dann noch Anpassungen im JavaScript und Konfiguration vom Lighty für das Handling statischer Dateien. Sowie die Formularverarbeitung für ein Kommentarsystem (eher rudimentär).

Ich hätte erwartet, dass das ganze länger dauert und war selbst etwas erstaunt, aber Python ist in meinen Augen eine sehr elegante Programmiersprache und das Django Framework unterstützt diesen Ansatz und verfolgt auch sonst eine Philosophie, die ich sehr gut finde.

Was mir spontan gut gefällt ist die Möglichkeit der Vererbung in den Templates. Mit einer Zeile am Anfang eines Templates:

{% extends path/to/base.html %}

kann ich einem Template sagen, dass es von meinem base.html Template erben soll. Einzelne Blöcke des Templates können dann überschrieben werden oder auch nicht, genau wie es man von der Vererbung bei der objektorientierten Programmierung gewohnt ist - sehr intuitiv. (Disclaimer: Es gibt bestimmt auch Template Engines in PHP die diese Funktionalität bieten, ich habe nur nie mit einer gearbeitet.)

Auch schnell überzeugt hat mich die Möglichkeit mit sehr wenig Aufwand JSON statt HTML Daten auszugeben, so wird es ziemlich einfach Backends für Ajax Anwendungen zu schaffen. Ein Beispiel hierzu schreibe ich demnächst in einem anderem Blogeintrag.

Für meinen lieblings Editor TextMate gibt es natürlich schon die entsprechenden Bundles, ein Django Bundle welches als Python (Django) fungiert und den Python Teil abdeckt und ein Django Template Bundle, welches als HTML (Django) fungiert und das Editieren der Django Templates einfacher macht.

An dem Template Bundle musste ich allerdings gleich mal eine Änderung machen, da es sonst nicht wirklich eine Vereinfachung beim Einfügen von Template-Tags gebracht hat.

Das Standard Verhalten von Django Templates :: templatetag: openblock war wie folgt: Ein Tab Trigger auf {% erzeugt {% templatetag openblock %}}. Und die doppelte Klammer ist kein Tippfehler, denn wenn man die öffnende Klammer eintippt erzeugt Textmate automatisch eine schließende und das Bundle noch eine. Desweiteren Steht der Cursor nach der Vervollständigung am Ende des Tags, editieren will ich aber innerhalb der Klammern. Will man {% als Trigger behalten, bietet sich folgende Lösung an:

{% $1 %

Ich habe mich aber dafür entschieden einfach nur % als Tab-Trigger zu verwenden - geht einfach noch schneller - und folgendes Snippet wird eingefügt:

{% $1 %} $0

Dadurch steht der Cursor zuerst zwischen den Klammern und durch drücken von Tab wandert er hinter die schließende Klammer. Funktioniert irgendwie deutlich besser als das Standardverhalten. Übrigens mit dem GetBundle-Bundle ist das Installieren von TextMate Bundles ein Kinderspiel.