My Universe Logo

My Universe Blog » Entries Tagged as Genshi

Python für Webanwendungen 3: Türsteher

Posted by Jesco Freund at Oct. 26, 2010 11:29 a.m.

Mit ein wenig Phantasie kann die Anwendung aus Teil 2 hübsche HTML-Seiten rendern und verschiedene Themes verwenden. Doch was, wenn eine dieser Ansichten vor unbefugten Augen geschützt werden soll? Sicher, CherryPy bringt eine rudimentäre Authentifizierung über HTTP-Auth mit – keine sehr elegante Lösung. Von einer modernen Webanwendung erwartet man eher ein Login-Formular.

Das wäre mit einem hübschen Template und einer Controller-Methode ja noch fix erledigt. Doch wogegen authentifiziert eine Anwendung eigentlich? Viele Webanwendungen haben die in meinen Augen sehr schlechte Angewohnheit, auf eine eigene Userverwaltung zu bauen. Als Backend kommen häufig Datenbank-Tabellen in einem RDBMS zum Einsatz. Ich finde das äußerst nervig, denn i. d. R. lassen sich diese User-Informationen nicht oder nur mit aufwändigen Hacks von anderen Anwendungen nutzen – mit der Konsequenz, dass User für jede Applikation ein eigenes Login-Handle benötigen.

Sowohl für User als auch Admin ist es viel angenehmer, wenn jedem User (z. B. in einem Unternehmen, einer Organisation, einer Community, …) genau ein Handle zugeordnet ist. Nur ein Passwort, das vergessen werden kann, Änderungen von Attributen (Nickname, Name, Mail-Adresse, …) schlagen in allen Anwendungen durch, und als Admin muss man sich nur mit einer Userdatenbank herumschlagen. LDAP bietet genau diese Möglichkeit: Alle User-Handles an einem Ort zu speichern, und diese mit zusätzlichen Attributen auszustaffieren - je nachdem, was die verschiedenen Anwendungen so benötigen. Auch der Zugriff auf einzelne Anwendungen oder Anwendungsbereiche lässt sich über LDAP-Gruppen regeln.

In diesem Teil geht es daher um die Implementierung eines eigenen Authentifizierungs-Moduls für unsere Webanwendung, das gegen einen LDAP-Verzeichnisdienst authentifiziert. Um das Beispiel erst mal nicht zu komplex gestalten, soll das Modul nur die übergebenen Credentials prüfen, um den Zugang zur Applikation zu erlauben oder zu verwehren. Komplexere Prüfungen (etwa die Zugehörigkeit zu einer bestimmten LDAP-Gruppe) lassen sich dann später leicht einbauen.

continue reading Python für Webanwendungen 3: Türsteher

No comments | Defined tags for this entry: CherryPy, code, development, Genshi, python

Python für Webanwendungen 2: Genshifizierung

Posted by Jesco Freund at Oct. 25, 2010 4:34 p.m.

Die im vorhergehenden Teil vorgestellte Anwendung ist in ihrem Können bisher eher sparsam – keine großartige Anwendungslogik, keine komplexe Steuerung, keine hübsche Darstellung. Genau diesem letzten Askpekt möchte ich mich im zweiten Teil der HowTo-Serie zu Python und Webanwendungen widmen. Für Webanwendungen (fast) unumgänglich ist die Darstellung der Oberfläche mittels (X)HTML. Die finsteren Zeiten, in denen man sich in CGI-Anwendungen das HTML-Dokument noch mittels print() zusammengebaut hat, sind glücklicherweise längst vorbei.

Heute benutzt man dafür Template-Systeme. Grundsätzlich lassen sich Template-Systeme in drei Kategorien einteilen:

  1. Als Platzhalter-Templates bezeichne ich Template-Systeme, die darauf beruhen, in einem (wie auch immer gearteten) Template-Dokument auf bestimmte Weise gekennzeichnete Platzhalter auszutauschen. Die Verarbeitung dieser Templates basiert meist auf Regulären Ausdrücken oder auf einfachen Suchen/Ersetzen-Operationen.
  2. XML-Templates würde ich Templates nennen, die einen eigenen XML-Namensraum definieren und dadurch dem xhtml-Namensraum im selben Dokument nicht in die Quere kommen. Die Verarbeitung erfolgt über einen XML-Parser, Xpath und ggf. XSLT-Transformationen.
  3. Kompilierte Templates kenne ich eigentlich nur aus einem Bereich, und hier stellen sie für mich einen Sonderfall der XML-Templates dar. Das Template wird beim Start der Applikation geladen und in eine Controller-Funktion umgewandelt, die aus den im Template eingebetteten Code-Schnipseln und print()-Anweisungen für die HTML-Dekoration besteht.

Für Python steht eine Reihe von fertigen Template-Systemen aus den Kategorien Platzhalter- und XML-Templates zur Verfügung. Gerade bei arbeitsteiliger Entwicklung bietet sich der Einsatz eines XML-Template Systems an. Auch wenn man sich dadurch zunächst etwas mehr Komplexität einhandelt – die höhere Flexibilität macht das in großen Teilen wieder wett. Aus dieser Überlegung heraus kommt in der Beispielanwendung das Template-System Genshi zum Einsatz.

continue reading Python für Webanwendungen 2: Genshifizierung

No comments | Defined tags for this entry: CherryPy, code, development, Genshi, python

Python für Webanwendungen 1: Projektstruktur

Posted by Jesco Freund at Oct. 25, 2010 1:03 p.m.

Hier nun wie angedroht der erste Teil, in dem ich einmal vorstellen möchte, wie man sich selbst basierend auf CherryPy und Genshi das Grundgerüst für eine Webanwendung aufbaut. Dabei geht es mir jedoch nicht um's Wiederkäuen der Dokumentation (wie etwa des Genshi Tutorials) – die darf jeder schön selber lesen ;-). Vielmehr geht es mir darum, ein Grundgerüst zu beschreiben, das eine belastbare Basis auch für komplexere Anwendungen darstellt. Das kommt IMHO in der angebotenen Dokumentation einfach zu kurz – ein „Hello, World“ mit dem gesamten Code in einer einzigen Python-Datei ist sicherlich kein Best Practice für die Entwicklung von Webanwendungen…

Zunächst einmal möchte ich kurz darauf eingehen, warum ich CherryPy und Genshi gewählt habe. Bei Genshi liegt der Fall relativ einfach: In meinen Augen ist es die derzeit mächtigste und professionellste Framework-unabhängige Template Engine, die für Python zu haben ist. Anders als bei vielen anderen Template-Engines üblich verwendet Genshi einen eigenen XML-Namensraum, so dass Templates während der Entwicklungsphase als ganz normale XHTML-Seiten behandelt werden können – für Designer und HTML-Bastler ein großes Entgegenkommen.

Bei CherryPy liegen die Pro's und Con's dichter beieinander. Auf der einen Seite bringt CherryPy schon Funktionalität mit, die ich eigentlich gar nicht haben will. Auf der anderen Seite ist CherryPy ein aktiv entwickeltes und gepflegtes Projekt, und genau die Dinge, die ich benötige, bringt es ebenfalls mit: WSGI-Fähigkeit, eine einfache Schnittstelle zum Request, URL-Mapping und Sessions. Als zusätzlicher Leckerbissen bringt CherryPy auch noch eine eigene Konfigurations-Engine mit und bietet mit der Tools-Schnittstelle ein zugleich einfaches und mächtiges Werkzeug für eigene Erweiterungen. Eine Alternative wäre gewesen, Flup als WSGI-Basis zu verwenden und URL-Mapping, Sessions und Request-Handling selbst zu implementieren. Die Wahrscheinlichkeit, dabei Bugs und ggf. eine Angriffsfläche gleich mit einzubauen, halte ich jedoch für relativ hoch – daher meine Entscheidung für CherryPy.

continue reading Python für Webanwendungen 1: Projektstruktur

No comments | Defined tags for this entry: CherryPy, code, development, Genshi, python

Python für Webanwendungen: Einführung

Posted by Jesco Freund at Oct. 25, 2010 12:49 p.m.

Django ist derzeit eines der mächtigsten RAD-Frameworks für's Web. Genau wie seine Konkurrenten (Ruby on Rails, Pylons, TurboGears & Co.) ist Django jedoch sehr stark auf Anwendungsfälle fixiert, in denen Datensätze in bzw. aus einem RDBMS angelegt, bearbeitet, angezeigt und gelöscht werden. In anderen Anwendungsfällen dominiert heute Java – wirklich gerechtfertigt ist das aber nicht.

Gerade Python macht es einem Entwickler dank WSGI und einer Vielzahl nützlicher Bibliotheken sehr leicht, sein eigenes Framework zusammenzusetzen. Dabei beziehe ich mich mit „Framework“ auf eine bestimmte Strukturierung der Anwendung, durch die Standard-Aufgaben (wie etwa das Rendern von HTML-Seiten) extrem einfach zu implementieren sind. Da ein ganzes Framework zu viel für einen einzelnen Blog-Eintrag ist, habe ich dieses HowTo in vier Stücke zerhackt:

  1. Aufbau einer Projektstruktur
  2. Integration von Genshi
  3. Authentifizierung gegen LDAP
  4. Deployment in einer Produktivumgebung

Zu guter Letzt noch ein kleiner Hinweis: Meine Code-Beispiele beziehen sich auf Python 2.7 – daher ist bei älteren Versionen (insbesondere <2.6) Vorsicht geboten. Gerade wenn Exceptions ins Spiel kommen, halte ich mich an die neue as-Notation gemäß PEP 3110.

No comments | Defined tags for this entry: CherryPy, code, development, Django, Genshi, python, TurboGears

Page 1 of 1