Welchen Sinn macht eine Templateengine?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
chriss13
User
Beiträge: 3
Registriert: Dienstag 20. Januar 2009, 15:36

Ich bin gerade am Erlernen von Python und möchte später was in Richtung Web mit Python machen.

Wie im Forum zu lesen ist benutzen eigentlich fast alle eine Templateengine. Jetzt stellt sich für mich nur die Frage. Warum?

Was ist der Riesenvorteil einer Templateengine? Immerhin muss auch sie erstmal erlernt werden.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Trennung von Logik (Python) und Struktur (Template Engine + HTML). Nenne eine Alternative. Wie würdest du "Es" ohne Template Engine machen?
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

Das hat etwas damit zu tun, wie viel Code man bei einer Änderung anpassen muss. Größere Projekte werden gerne in Model, View und Controler getrennt, damit man jeden Teil getrennt voneinander entwerfen und implementieren kann. Eine Templateengine sorgt dafür, dass die Daten nicht schon bei der Bereitstellung in einer Form vorliegen müssen, wie sie später dargestellt werden, sondern zunächst so bereit gestellt werden können, wie es der Programmlogik entspricht. Erst die Templateengine bereitet dann die Daten so auf, wie sie in die konkrete HTML Seite eingefügt werden können. Auf diese Weise muss nichts an der dahinter liegenden Programmlogik verändert werden, wenn das Layout der Seite angepasst werden soll. So kann sich der Programmierer auf das Programm und der Designer auf das Design konzentrieren.
http://www.felix-benner.com
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Was liest sich besser?

Code: Alles auswählen

s = "<h2>User</h2>"
if users:
    s += "<ul>"
    for user in users:
        s += "<li>" + user.name + "</li>"
    s += "</ul>"
return s
oder

Code: Alles auswählen

<h2>Users</h2>
<ul tal:for="user in users">
  <li tal:content="user.name"/>
</ul>
oder

Code: Alles auswählen

:h2 Users
  :ul[for user in users]
    :li= user.name
Wenn du meinst, die erste Variante, dann brauchst du keine Template-Engine ;) Im Übrigen wäre die erste Variante mit dem Addieren von Strings viel ineffizienter und sollte besser eine out()-Methode o.ä. benutzen. Natürlich gibt es auch bei Template-Engines viele Freiheitsgrade und manchmal sehen die Ergebnisse auch nicht besser als Python-Code aus.

Stefan
chriss13
User
Beiträge: 3
Registriert: Dienstag 20. Januar 2009, 15:36

Die beiden letzteren Varianten von sma wirken auf mich eleganter und übersichtlicher.

Mein grundsätzliches Verständnisproblem bleibt jedoch. Die eigentliche Trennung von Logik und Struktur kriegt man meineserachtens auch ohne TemplateEngine hin.

Und in der Ausgabe selbst ist eine Vermengung von 2 verschiedenen Sprachen wohl gar nicht umgehbar. Ob ich jetzt Python Code mit HTML mische oder Template Code mit HTML ist dann wohl eine Geschmacksfrage.

Nachdem was hier geschriebe wurde ist aus meiner Sicht der Grund eine Templateengine zu verwenden derjenige, das man auf Kosten eines erstmal zusätzlichen Lernaufwands später größtenteils kürzere und damit übersichtlichere Ausgabedateien hinbekommt. Kann man das so sagen?

Noch 3 Fragen habe ich:
Ist der Aufwand eine Templateengine zu erlernen groß? Und 2. was mache ich wenn meine Ausgabe doch mal etwas komplizierter sein soll. Wahrscheinlich muss ich dann doch wieder auf Python-Code ausweichen. Wie sieht es diesbezüglich in der Praxis aus?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

chriss13 hat geschrieben:Mein grundsätzliches Verständnisproblem bleibt jedoch. Die eigentliche Trennung von Logik und Struktur kriegt man meineserachtens auch ohne TemplateEngine hin.
Beispielcode?
chriss13 hat geschrieben:Und in der Ausgabe selbst ist eine Vermengung von 2 verschiedenen Sprachen wohl gar nicht umgehbar. Ob ich jetzt Python Code mit HTML mische oder Template Code mit HTML ist dann wohl eine Geschmacksfrage.
Jein. Wenn ich den Leuten die bei uns in der Firma die Templetes schreiben Python-Code in den Templates vorlege, dann lehnen die ab, damit zu arbeiten. Kann ich auch irgendwieweit verstehen.
chriss13 hat geschrieben:Ist der Aufwand eine Templateengine zu erlernen groß? Und 2. was mache ich wenn meine Ausgabe doch mal etwas komplizierter sein soll. Wahrscheinlich muss ich dann doch wieder auf Python-Code ausweichen. Wie sieht es diesbezüglich in der Praxis aus?
Der Aufwand für die Templateengine ist unterschiedlich. Für Systeme wie TAL/Genshi braucht man länger, aber bei Django-Templates konnte ich nach 30 Minuten recht gut damit umgehen. Und was kompliziertere Sachen angeht, so bietet Jinja mehrere Ansatzpunkte an, an denen man Erweiterungen anbringen kann. Teilweise rendere ich einzelne Stücke (auch als Templates), die ich dann in einem anderen Template zum Endergebnis zusammensetze. Aber Bedarf Python-Code in den Templates zu verwenden habe ich eigentlich keinen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wurde hier schon das Stichwort "inheritance" genannt? Imho auch ein massiver Vorteil von Templates. Man kann damit die HTML-Ausgaben sehr schön strukturieren und ggf. mit kleinen Änderungen am "Haupt"-Template der Seite einen ganz neuen Look geben, ohne alles andere anfassen zu müssen.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Leonidas hat geschrieben:
chriss13 hat geschrieben:Mein grundsätzliches Verständnisproblem bleibt jedoch. Die eigentliche Trennung von Logik und Struktur kriegt man meineserachtens auch ohne TemplateEngine hin.
Beispielcode?
Wo er Recht hat hat er Recht, man muss sich nur mehr aufpassen bei der Trennung. Siehe Tk, Gtk etc. da programmiert man die View meist auch direkt in Python. Kann man wenn man will aber trotzdem sauber trennen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Darii hat geschrieben:Siehe Tk, Gtk etc. da programmiert man die View meist auch direkt in Python.
Also bei GTK programmiert man die View oft gar nicht, da nutzt man Glade und ggf. PyGTK MVC.

Das es möglich ist kann schon sein, aber warum sich das Leben schwermachen? Daher wollte ich sehen wie er das mit Pythoncode machen würde.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Leonidas hat geschrieben:Also bei GTK programmiert man die View oft gar nicht, da nutzt man Glade und ggf. PyGTK MVC.
PyGTKMVC sieht ja sogar recht nett aus. Besonders das data binding.
chriss13
User
Beiträge: 3
Registriert: Dienstag 20. Januar 2009, 15:36

Danke euch für die Antworten.

Macht wohl sinn sich mit einer Templateengine auseinanderzusetzen. Was könnt ihr mir empfehlen? Im Forum ist oft von Jinja die Rede.
lunar

chriss13 hat geschrieben:Macht wohl sinn sich mit einer Templateengine auseinanderzusetzen. Was könnt ihr mir empfehlen? Im Forum ist oft von Jinja die Rede.
Jinja2 oder Mako.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:
chriss13 hat geschrieben:Macht wohl sinn sich mit einer Templateengine auseinanderzusetzen. Was könnt ihr mir empfehlen? Im Forum ist oft von Jinja die Rede.
Jinja2 oder Mako.
Wenn man XML mag, dann ggf. noch Genshi.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Und wenn man das "Geschwungene-Klammern-Gewitter" mancher Vorlagensprachen nicht mag, dann ist Cheetah http://www.cheetahtemplate.org/ keine schlechte Wahl. Meine Erfahrung damit: http://halvar.at/python/cherrypy_cheetah/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:"Geschwungene-Klammern-Gewitter"
Das ist in Jinja konfigurierbar, ich könnte dort auch Rauten nehmen. Was ich aber noch übler finde, YMMV.

Das es konfigurierbar ist finde ich persönlich wichtig, denn für TeX-Code brauche ich etwas anderes an geschweifte Klammern, da TeX auch geschweifte Klammern verwendet und dann alles unübersichtlich wird.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Mir gefällt Cheetah einfach gut. Deshalb schlage ich es gerne vor.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

from Cheetah.Template import Template

vorlagentext = """
<table>
  #for $line in $lines
    <tr>
      #for $item in $line
        <td>$item</td>
      #end for
    </tr>
  #end for
</table>
"""

lines = [
    ["Halvar", "der Wickinger"],
    ["Uhudler", "der Wein"],
    ["Stiegl", "das Bier"],
    ["Hansi", "der Postbote"],
    ["ATtiny13", "der AVR Mikrocontroller"],
    ["Python", "die Programmiersprache"],
]

template = Template(vorlagentext)
template.lines = lines
print template
Und das kommt dabei heraus:

Code: Alles auswählen

<table>
    <tr>
        <td>Halvar</td>
        <td>der Wickinger</td>
    </tr>
    <tr>
        <td>Uhudler</td>
        <td>der Wein</td>
    </tr>
    <tr>
        <td>Stiegl</td>
        <td>das Bier</td>
    </tr>
    <tr>
        <td>Hansi</td>
        <td>der Postbote</td>
    </tr>
    <tr>
        <td>ATtiny13</td>
        <td>der AVR Mikrocontroller</td>
    </tr>
    <tr>
        <td>Python</td>
        <td>die Programmiersprache</td>
    </tr>
</table>
Und im normalen Leben hällt man den Vorlagencode in einer Textdatei. Dann kann dieser unabhängig vom Programmcode verändert werden. Der Programmcode ist für den Programmierer und der Vorlagencode für den Designer.

EDIT:

Man kann in dieses Beispiel auch Vererbung einbauen. Natürlich ist es schlechter Stil, den Vorlagentext in das Programm direkt einzubauen. Aber ich dachte mir, so erkennt man im Beispiel vielleicht die Zusammenhänge besser.

Programm --> http://paste.pocoo.org/show/100807/
Ergebnis --> http://paste.pocoo.org/show/100810/

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

@Gerald:

Code: Alles auswählen

>>> from jinja2 import Environment
>>> env = Environment(line_statement_prefix="#",
..     variable_start_string="${", variable_end_string="}")
>>> tmpl = env.from_string("""\
... <table>
...   # for line in lines
...     <tr>
...       # for item in line
...         <td>${item}</td>
...       # endfor
...     </tr>
...   # endfor
... </table>""")
>>> print tmpl.render(lines=[
...     ["Halvar", "der Wickinger"],
...     ["Uhudler", "der Wein"],
...     ["Stiegl", "das Bier"],
...     ["Hansi", "der Postbote"],
...     ["ATtiny13", "der AVR Mikrocontroller"],
...     ["Python", "die Programmiersprache"],
... ])
<table>
    <tr>
        <td>Halvar</td>
        <td>der Wickinger</td>
    </tr>
    <tr>
        <td>Uhudler</td>
        <td>der Wein</td>
    </tr>
    <tr>
        <td>Stiegl</td>
        <td>das Bier</td>
    </tr>
    <tr>
        <td>Hansi</td>
        <td>der Postbote</td>
    </tr>
    <tr>
        <td>ATtiny13</td>
        <td>der AVR Mikrocontroller</td>
    </tr>
    <tr>
        <td>Python</td>
        <td>die Programmiersprache</td>
    </tr>
</table>
TUFKAB – the user formerly known as blackbird
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo mitsuhiko!

Ja, so lässt es sich auch mit Jinja leben. :D

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten