Webseiten einfach verwalten mit python und cheetah
Tagged:  •    •    •    •  

Des öfteren steht man ja vor dem Problem das man eine kleine Seite mit ungefähr 5-20 Seiten machen will. Da das ganze auch noch in sauberem xhtml ohne Frames geschehen soll, steht man vor dem Problem bei einer kleinen Änderrung am Design alle Seiten editieren zu müssen. Bei 5 Seiten geht das vieleicht ja gerade noch so, aber 20 Seiten verzweifelt man ja dann doch sehr schnell.

Und genau jetzt kommt die Schlange mit dem Geparden ins Spiel. Cheetah ermöglicht es einem eine Vorlage mit Inhalt zu füllen.

Jetzt aber zum eigentlichen Spiel. Zuerst muss man python und dann cheetah installieren. Dann legt man eine Verzeichnisstruktur die so aussieht:

\--.
   |
   \--output
   |
   \--template_files

Dann erstellt man das python script, das die Drecksarbeit erledigt, ich habe es genSite.py gennant:

  1. from Cheetah.Template import Template
  2. import sys
  3.  
  4. """
  5. Die Einstellungen:
  6. template - Die Vorlagendatei, so sehen die Seiten später aus.
  7. output - Hier werden die Seiten hingeneriert
  8. templateDir - Hier sind die Inhaltsdateien drinne
  9. """
  10.  
  11.  
  12. template = "template.html"
  13. output = "output/"
  14. templateDir = "template_files/"
  15.  
  16. myFile = open(template, 'r')
  17. templateDef = myFile.read()
  18.  
  19. templateFile = sys.argv[1]
  20.  
  21. templateFileContent = (open(templateDir + sys.argv[1] + '.html')).read()
  22.  
  23. title = (templateFile.split("\n"))[0]
  24.  
  25. inhalt = (templateFile.split("\n",1))[1]
  26.  
  27. nameSpace = {'title': title, 'inhalt': inhalt}
  28. t = Template(templateDef, searchList=[nameSpace])
  29.  
  30. myTemplate = open(output + sys.argv[1] + ".html", "w")
  31.  
  32. myTemplate.write(str(t))

Mein Konzept für die Inhaltsdateien sieht es vor, dort eine Überschrift und den eigentlichen Inhalt zu hinterlegen. Die erste Zeile ist die Überschrift und die nächste bis zum Ende ist der Inhalt. Die Dateinamen müssen auf .html enden.

Nächster Punkt ist die Vorlage an sich. Die Schlüsselwörter für die Überschrift ist $title und für den Inhalt $content. So könnte zum Beispiel eine Vorlage aussehen:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3.            "http://http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  5.  
  6. <head>
  7.   <title>$title</title>
  8.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  9.         <link rel="stylesheet" type="text/css" href="style.css" />
  10.  
  11.  
  12. </head>
  13. <body>
  14. $content
  15. </body>
  16. </html>

Nun erstellt man eine HalloWelt.html im Ordner template_files mit einem beliebigen Inhalt. Jetzt ruft man das Script auf:

python genSite.py HalloWelt

Nun sollte sich im output-Ordner eine Datei mit dem Titel HalloWelt.html befinden, die ungefähr so aussieht:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3.   "http://http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  5. <head>
  6.   <title>Hallo Welt</title>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. <link rel="stylesheet" type="text/css" href="style.css" />
  9. </head>
  10. <body>
  11. Ich bin eine Hallo Welt Seite!
  12. </body>
  13. </html>

Zum Schluss empfiehlt es sich noch ein kleines Script anzulegen in dem alle Dateien aufgerufen werden, das könnte in bash-script so aussehen:

  1. #!/bin/bash
  2. echo "Erstelle HalloWelt"
  3. python gentemplate.py HalloWelt

Oder unter windows so:

  1. gentemplate.py HalloWelt

Morgen! Wenn ich das alles

Morgen!

Wenn ich das alles richtig verstanden habe (Du schreibst sehr kompliziert) dann brauche ich die Datei gensite.py mit folgendem Inhalt:

from Cheetah.Template import Template
import sys

template = "template.html"
output = "output/"
templateDir = "template_files/"
myFile = open(template, 'r')
templateDef = myFile.read()
templateFile = sys.argv[1]
templateFileContent = (open(templateDir + sys.argv[1] + '.html')).read()
title = (templateFile.split("\n"))[0]
inhalt = (templateFile.split("\n",1))[1]
nameSpace = {'title': title, 'inhalt': inhalt}
t = Template(templateDef, searchList=[nameSpace])
myTemplate = open(output + sys.argv[1] + ".html", "w")
myTemplate.write(str(t))

sowie die Datei HelloWelt.html mit diesem Inhalt:

HalloWelt!

und die Datei Template.html mit folgendem Inhalt:

"http://http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
$content

Wenn ich das alles mit python gensite.py HelloWelt ausführe, dann erhalte ich folgende Fehlermeldung:

Traceback (most recent call last):
File "gensite.py", line 12, in ?
inhalt = (templateFile.split("\n",1))[1]
IndexError: list index out of range

Wird denn dieses blog nicht

Wird denn dieses blog nicht mehr gepflegt? :jawdrop:

Aaaaaaaaaaaaaaaaaah,

:) Aaaaaaaaaaaaaaaaaah, wunderbar! Endlich ein fertiger Text der den Leser nicht mit diversen Rätseln stehen lässt. Danke.

Hallo Dirk, ich hoffe du

Hallo Dirk,

ich hoffe du kommst damit jetzt besser zurecht. Bei meinem Umstieg auf Drupal 5 hatte ich vergessen das vim color plugin zu installieren das dafür sorgt das der code so schön bunt erscheint.

Falls du noch Probleme haben solltest schreib einfach hier rein, dann schau ich mir das nochmal an.

HTH

Tim

They that sow in tears will reap in joy.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <ins> <del> <blockquote> <abbr> <br> <pre> <p>
  • You can use Markdown syntax to format and style the text. Also see Markdown Extra for tables, footnotes, and more.
  • Lines and paragraphs break automatically.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]".

More information about formatting options