|
Navigation:
Startseite Python bei O'Reilly Python & Tkinter Tkinter (deutsch) Tkinter (english) ftp mit Python Dialogboxen Kapitän Warum Python? Erste Schritte Grafische Ausgabe Das Modul W Easy Dialogs Mac File Dialogs Apfelmännchen Piddle & MacOS X Dancing Python User-Agenten XML-RPC Blogger API Anti-Spam-Script Template-Engine Python & XML Python Cookbook Impressum Schockwellenreiter
 |
Template-Engine
Eine einfache Template-Engine in Python
Templates erlauben es, die Trennung von Programmier-Logik und Design zu verwirklichen. Der Designer entwirft die HTML-Seiten und an die Stellen, wo der Content eingepflegt werden soll, werden nur Platzhalter angegeben. Platzhalter trifft man häufig in der Form <% platzhalter %> an.
Beliebte Template-Engines in Python sind die DTML, die Template-Engine von Zope und HTMLgen. DTML ist jedoch eine eigene Scriptsprache und so wird durch die Programmierlogik von DTML das Prinzip der Trennung von Design und Logik wieder durchbrochen. HTMLgen wiederum ist für viele einfache Aufgaben schlicht zu groß, außerdem scheint es zur Zeit nicht mehr gepflegt zu werden.
Da das Prinzip aber einfach ist, habe ich eine kleine, simple Template-Engine selber geschrieben.
import string
class HTMLTemplate:
def __init__(self, template):
f_in = open(template, "r")
self.htmlText = f_in.read()
f_in.close
def substitute(self, **params):
for arg in params:
replaceString = "<% " + arg + " %>"
self.htmlText = string.replace(self.htmlText,
replaceString, params[arg])
def writeHTML(self, fileName):
f_out = open(fileName, "w")
f_out.write(self.htmlText)
f_out.close()
if __name__ == "__main__":
test = HTMLTemplate("test.template")
test.substitute(name = "Jörg Kantel", wohnort = "Berlin")
test.writeHTML("output.html")
Zuerst wird das Module string importiert. Dann die Klasse HTMLTemplate erzeugt. Der Konstruktor (__init__) macht nichts anderes, als den Text des Templates einzulesen und in einer internen Variabeln abzuspeichern.
Die eigentliche Substitution findet in der Funktion substitute() (wo denn auch sonst?) statt. Die Funktion nutzt aus, daß mit **params einer Python-Funktion eine beliebige Anzahl von Schlüsselwort-Variablen übergeben werden kann, auf die intern als Liste von Dictionaries (für Perl-Programmierer: Hashes) zugegriffen wird.
Die letzte Funktion (writeHTML) macht genau das, was ihr Name sagt: Sie speichert die HTML-Datei ab und muß daher als Parameter den Namen (incl. Pfad) der zu generierenden HTML-Datei mitbekommen.
Die Zeilen ab if __name__ == "__main__": sind eine Testfunktion, die zeigt, wie diese neue Klasse funktioniert. Ich habe sie mit folgendem Template gefüttert:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>Test-Datei</title>
<meta name="generator" content="BBEdit 6.5">
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" alink="#00FF00" vlink="#FF00FF">
<p>
Mein Name ist <% name %> und ich wohne in <% wohnort %>. Und ich finde, <% wohnort %> ist eine schöne Stadt.</p>
</body>
</html>
Das Ergebnis könnt Ihr hier bewundern. Schlagt mich nicht, wegen des idiotischen Textes in der Test-Datei, mir fiel gerade nichts Besseres ein.
Aber generell ist das wieder ein Beispiel, wie man schon mit wenigen Zeilen eine doch recht mächtige Funktion in Python programmieren kann.
Script different!
| |