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.
Welchen Sinn macht eine Templateengine?
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
Was liest sich besser?
oder
oder
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
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
Code: Alles auswählen
<h2>Users</h2>
<ul tal:for="user in users">
<li tal:content="user.name"/>
</ul>
Code: Alles auswählen
:h2 Users
:ul[for user in users]
:li= user.name
Stefan
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?
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?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Beispielcode?chriss13 hat geschrieben:Mein grundsätzliches Verständnisproblem bleibt jedoch. Die eigentliche Trennung von Logik und Struktur kriegt man meineserachtens auch ohne TemplateEngine hin.
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: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.
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.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?
- 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.
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 hat geschrieben:Beispielcode?chriss13 hat geschrieben:Mein grundsätzliches Verständnisproblem bleibt jedoch. Die eigentliche Trennung von Logik und Struktur kriegt man meineserachtens auch ohne TemplateEngine hin.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Also bei GTK programmiert man die View oft gar nicht, da nutzt man Glade und ggf. PyGTK MVC.Darii hat geschrieben:Siehe Tk, Gtk etc. da programmiert man die View meist auch direkt in Python.
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.
Jinja2 oder Mako.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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Wenn man XML mag, dann ggf. noch Genshi.lunar hat geschrieben:Jinja2 oder Mako.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.
- 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
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Das ist in Jinja konfigurierbar, ich könnte dort auch Rauten nehmen. Was ich aber noch übler finde, YMMV.gerold hat geschrieben:"Geschwungene-Klammern-Gewitter"
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.
- 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.
Und das kommt dabei heraus:
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
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
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>
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
-
- 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
- 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.
lg
Gerold
Ja, so lässt es sich auch mit Jinja leben.
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.