Jinja 0.6 ist fertig. Jinja ist eine Python Template engine, wer sowas sucht kann sich Jinja mal ansehen. Features:
* template inheritance
* einfaches escaping
* non xml syntax
* schnell dank caching
Link: http://cheeseshop.python.org/pypi/Jinja
Docs: http://wsgiarea.pocoo.org/jinja/docs/
Jinja 0.6
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Naja, die Geschwindigkeit ist nicht überragend, sondern wohl ehr Durchschnitt: http://www.python-forum.de/viewtopic.php?p=31352#31352
Aber das ist IMHO nicht der endscheidene Punkt. Ich hatte mich eigentlich für simpleTAL entschieden, welches ja einein Tick schneller ist. Allerdings ist die Templatesprache schon ziemlich kompliziert, wenn man es mit der Einfachheit von Jinja vergleicht. Deswegen hatte ich auch erst nur zwei Sachen in simpleTAL gelöst.
Von daher werde ich auf Jinja setzten.
EDIT: Und wie ich sehe, hab ich das eigentlich schon bei http://www.python-forum.de/viewtopic.php?p=31370#31370 geschrieben
Aber das ist IMHO nicht der endscheidene Punkt. Ich hatte mich eigentlich für simpleTAL entschieden, welches ja einein Tick schneller ist. Allerdings ist die Templatesprache schon ziemlich kompliziert, wenn man es mit der Einfachheit von Jinja vergleicht. Deswegen hatte ich auch erst nur zwei Sachen in simpleTAL gelöst.
Von daher werde ich auf Jinja setzten.
EDIT: Und wie ich sehe, hab ich das eigentlich schon bei http://www.python-forum.de/viewtopic.php?p=31370#31370 geschrieben

-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Wenn du weiter unten zu den Testvergleiche schaust:jens hat geschrieben:Naja, die Geschwindigkeit ist nicht überragend, sondern wohl ehr Durchschnitt: http://www.python-forum.de/viewtopic.php?p=31352#31352
Aber das ist IMHO nicht der endscheidene Punkt. Ich hatte mich eigentlich für simpleTAL entschieden, welches ja einein Tick schneller ist.
Code: Alles auswählen
Running Test 'jinja'
TIME 0.00307821240425
Running Test 'kid'
TIME 0.00703014059067
Running Test 'simpletal'
TIME 0.0100415547848
Running Test 'cheetah'
TIME 0.00251657156944
TUFKAB – the user formerly known as blackbird
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab eine Frage, wie kann man sowas machen:
Code: Alles auswählen
{% if len(dir)>15 %}
<h3>{{ dir.letter }}</h3>
{% endif %}
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Gar nichtjens hat geschrieben:Hab eine Frage, wie kann man sowas machen:
Code: Alles auswählen
{% if len(dir)>15 %} <h3>{{ dir.letter }}</h3> {% endif %}

Code: Alles auswählen
{% if dir.show_headline %}
<h3>{{ dir.letter }}</h3>
{% endif %}

TUFKAB – the user formerly known as blackbird
Weiss grad nich, ob ich das jetzt falsch verstanden habe, aber letztendlich läuft das ganze darauf hinaus, dass ein Grossteil des Modells in ein riesiges Dictionary gepackt (=Context) und dann an die Templateengine weitergereicht wird.
Das erinnert mich stark an die JavaServer Pages, wo man sehr umständlich für jeden View (=jedes Webformular) eine extra Klasse bauen muss, die die Daten des Views kapselt. Nur muss man hier keine Klasse bauen, sondern eben diese Hashmap...
Was spricht gegen den Zugriff des Views auf das Modell? Laut dem Model-View-Controller-Designpattern kann der View auf das Modell zugreifen, nur der Weg andersrum ist versperrt (was IMHO auch Sinn macht).
Ja, Logik gehört in die Anwendung (das Modell), aber du meinst sicherlich die Geschäftslogik, die in das Geschäftsmodell gehört.
Wenn ein View aber die konkrete Darstellung eines Sachverhaltes (z.B. ein Textstring) von einer Eigenschaft dieses Sachverhalts (z.B. Länge des Strings) abhängig macht, so hat diese Logik nix im Modell zu suchen, oder?
Das wirkt wie m.M.n. wie doppelte Arbeit:
1. Daten (meinetwegen auch automatisiert per ORM Engine) von der Datenbank holen und in Pythonobjekte schreiben
2. Daten aus den Pythonobjekten in eine Context-Hashmap kopieren
3. Hashmap an die Templateengine liefern und rendern
Oder wo ist mein Denkfehler?
Das erinnert mich stark an die JavaServer Pages, wo man sehr umständlich für jeden View (=jedes Webformular) eine extra Klasse bauen muss, die die Daten des Views kapselt. Nur muss man hier keine Klasse bauen, sondern eben diese Hashmap...
Was spricht gegen den Zugriff des Views auf das Modell? Laut dem Model-View-Controller-Designpattern kann der View auf das Modell zugreifen, nur der Weg andersrum ist versperrt (was IMHO auch Sinn macht).
Ja, Logik gehört in die Anwendung (das Modell), aber du meinst sicherlich die Geschäftslogik, die in das Geschäftsmodell gehört.
Wenn ein View aber die konkrete Darstellung eines Sachverhaltes (z.B. ein Textstring) von einer Eigenschaft dieses Sachverhalts (z.B. Länge des Strings) abhängig macht, so hat diese Logik nix im Modell zu suchen, oder?
Das wirkt wie m.M.n. wie doppelte Arbeit:
1. Daten (meinetwegen auch automatisiert per ORM Engine) von der Datenbank holen und in Pythonobjekte schreiben
2. Daten aus den Pythonobjekten in eine Context-Hashmap kopieren
3. Hashmap an die Templateengine liefern und rendern
Oder wo ist mein Denkfehler?
--
http://www.weltenwerk.net
^^
http://www.weltenwerk.net
^^
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Der Context ist eine Art dict. Soweit richtig. Es ist eigentlich ein multidimenisonales dict, weil es mehrere Ebenen haben kann (aber das wird nur intern genutzt).synopia hat geschrieben:Das wirkt wie m.M.n. wie doppelte Arbeit:
1. Daten (meinetwegen auch automatisiert per ORM Engine) von der Datenbank holen und in Pythonobjekte schreiben
2. Daten aus den Pythonobjekten in eine Context-Hashmap kopieren
3. Hashmap an die Templateengine liefern und rendern
In den Context kannst du so ziemlich alles packen. Sowas geht auch:
Code: Alles auswählen
class Test(object):
name = "Hello"
c = Context(locals())
Code: Alles auswählen
{{ Test.name }}
TUFKAB – the user formerly known as blackbird