Dienstag, 26. Juli 2011

Python CGI und Templates - die Eleminierung von überflüssigen print-Statements

Zugegebener Maßen ist es vielleicht nicht mehr ganz auf der Höhe der Zeit, über Python und CGI-Programmierung zu schreiben. Schließlich ist WSGI der Stand der Technik und absolut die 1. Wahl bei der Webprogrammierung mit Python.

Nun ist aber auch so, dass das Urgestein CGI noch lange nicht am Ende ist. Das hat wohl mehrere Gründe: So unterstützt quasi jeder Webserver CGI mit Bordmitteln, während WSGI-Unterstützung - so fern überhaupt vorhanden - in der Regel nachträglich installiert und konfiguriert werden muss. Ein weiterer Punkt ist, dass inzwischen zwar relativ viele Anbieter von Homepage-Paketen / Webspace Python unterstützen - aber eben nur für CGI-Skripte. WSGI ist hier die absolute Ausnahme und wirklich rar.

Daher ist es auch nicht so verwunderlich, dass in Python Support-Foren auch immer wieder Fragen zu Thema „Python + CGI“ auftauchen.

Nun, weiter schwierig ist das Thema wirklich nicht. Eine Standardinstallation von Python enthält bereits ein Modul für CGI, Tutorials gibt es haufenweise im Web.

Eine Sache findet man jedoch recht selten: Die Nutzung von Standard-Templates (im Python String-Modul enthalten) in Kombination mit CGI. In vielen CGI Tutorials findet man eher ellenlange print Statements. Gut, zum einen könnte es daran liegen, dass das Templates erst seit Python 2.4 an Bord sind, viele Tutorials sind aber (wahrscheinlich) älter. Durch die Verwendung von Templates wird aber die Programmlogik von der Darstellung / Ausgabe getrennt, was das Programm an sich zum einen wesentlich übersichtlicher macht und zum anderen die Codepflege vereinfacht.

Das Vorgehen dabei ist eigentlich simpel: Man erstellt eine Template-Datei, was nichts anderes als eine „normale“ HTML-Datei ist, die aber die Platzhalter für die spätere Ersetzung enthält. Das CGI-Skript lädt dann diese Datei, generiert ein Dict, welches die Werte für die Substitution enthält und lässt das Template dann am Ende ausgeben.

Das folgende minimalistische Beispiel verdeutlicht dies. Es werden drei Dateien erstellt: die HTML-Datei namens „index.html“, welche das Eingabeformular enthält, das Template „ausgabe.html“ und das CGI-Skript „ausgabe.cgi“.

index.html:
<html>
<head>
<title>Python CGI und Templates</title>
</head>
<body>
<form action="cgi-bin/ausgabe.cgi">
<p>Bitte Namen eingeben: <input type="text" name="name"></p>
<p><input type="submit"></p>
</form>
</body>
</html>

ausgabe.html:
<html>
<head>
<title>Hallo CGI-Welt!</title>
</head>
<body>
<p>Hallo $name!</p>
</body>

ausgabe.cgi:
#!/usr/bin/env python

import cgi
from string import Template

form = cgi.FieldStorage()
name = form['name'].value
ersetzung = {'name': name}
temp = Template(open('ausgabe.html').read())

print 'Content-type: text/html'
print
print temp.substitute(ersetzung)

Letztendlich also nicht anderes als ein reguläres Template, nur halt in einem CGI angewendet.

Natürlich könnte man auch ein „echtes“ Template-Modul wie z.B. Jinja2, Mako oder Genshi einsetzen, sofern man selber Python-Module installieren kann bzw. darf. Für einfache Seiten reichen die Templates aus dem String-Modul aber alle Mal.

Zum Abschluss dann noch der obligatorische Hinweis, dass man dieses Beispiel natürlich nicht 1:1 für seine Anwendung übernehmen darf, da keinerlei Prüfung etc. des Eingabewerts „name“ erfolgt, was in realen Anwendungen eine Sicherheitslücke darstellen würde.

Keine Kommentare:

Kommentar veröffentlichen