Seite 1 von 1

Jinja 0.6

Verfasst: Dienstag 21. Februar 2006, 20:55
von mitsuhiko
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/

Verfasst: Dienstag 21. Februar 2006, 23:53
von modelnine
Und selbst ohne caching noch vergleichsweise schnell... ;-) Ich staune auf jeden Fall immer wieder.

Verfasst: Mittwoch 22. Februar 2006, 07:31
von jens
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 :oops:

Verfasst: Mittwoch 22. Februar 2006, 13:23
von mitsuhiko
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.
Wenn du weiter unten zu den Testvergleiche schaust:

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
Da ist einzig Cheetah schneller. Rest hat ziemlichen Rücksprung.

Verfasst: Freitag 3. März 2006, 17:17
von jens
Hab eine Frage, wie kann man sowas machen:

Code: Alles auswählen

{% if len(dir)>15 %}
      <h3>{{ dir.letter }}</h3>
{% endif %}

Verfasst: Freitag 3. März 2006, 20:49
von mitsuhiko
jens hat geschrieben:Hab eine Frage, wie kann man sowas machen:

Code: Alles auswählen

{% if len(dir)>15 %}
      <h3>{{ dir.letter }}</h3>
{% endif %}
Gar nicht :-) Das müsstest du schon in den Context einbauen.

Code: Alles auswählen

{% if dir.show_headline %}
    <h3>{{ dir.letter }}</h3>
{% endif %}
Logik gehört in die Anwendung und nicht ins Template :-)

Verfasst: Freitag 3. März 2006, 22:12
von synopia
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?

Verfasst: Samstag 4. März 2006, 00:08
von mitsuhiko
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
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).

In den Context kannst du so ziemlich alles packen. Sowas geht auch:

Code: Alles auswählen

class Test(object):
    name = "Hello"

c = Context(locals())
Dann könntest du im template so drauf zugreifen:

Code: Alles auswählen

{{ Test.name }}

Verfasst: Montag 3. April 2006, 08:47
von jens
Es gibt ja den schönen Filter filesizeformat:
{{ i|filesizeformat }}

Format the value like a 'human-readable' file size (i.e. 13 KB, 4.1 MB, 102 bytes, etc).
Ich vermisse allerdings eine Art strftime Filter ;)