Pythonmania

Script Different!

Suchen in:
Suche:
In Partnerschaft mit Amazon.de
Startseite | Schockwellenreiter | Impressum
Anzeigen


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&ouml;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?) Smile 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&ouml;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.

Python Icon   Script different!






Werbung: