Pythonmania.de
Script different! Mein Icon

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

Python Logo

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&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!


Mein Icon © Copyright 2000 - 2002: Jörg Kantel.
Last update: 13.10.2002; 21:33:33 Uhr.
This site is edited with Radio UserLand, the first personal Web Application server for Windows and Macintosh.  Let iCab smile  Site Meter