Jinja 0.6

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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/
TUFKAB – the user formerly known as blackbird
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Und selbst ohne caching noch vergleichsweise schnell... ;-) Ich staune auf jeden Fall immer wieder.
--- Heiko.
Benutzeravatar
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 :oops:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
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 %}

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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 :-)
TUFKAB – the user formerly known as blackbird
synopia
User
Beiträge: 17
Registriert: Mittwoch 1. März 2006, 19:47

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?
--
http://www.weltenwerk.net
^^
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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 }}
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten