Jinja, Globals und Dictionary
Verfasst: Dienstag 17. Juni 2008, 23:38
Hallo,
mein Hirn ist zwar schon ein wenig heruntergefahren ob der Uhrzeit, aber ich stelle die Frage hier dann trotzdem noch.
Ich bin grad dabei eine kleine WSGI-Applikation mit Werkzeug und Jinja zu schreiben. Nun habe ich anscheinend aber ein Designproblem oder aber ein Verständnisproblem oder etwas anderes schlimmes
Also: Ich möchte eine URL zusammenbaslten und habe in einer utils.py Datei folgende Funktion:
Diese ist identisch zu der aus dem Werkzeug-Tutorial und funktioniert aus meiner Applikation heraus auch.
Nun möchte ich auf meiner Hauptseite eine Liste von Links ausgeben, die zu Unterseiten führen, also der endpoint 'karte'. Der Aufbau der Links kann man aus der Definition der Regeln entnehmen:
Also z.B. ergibt der Aufruf der Funktion url_for z.B. folgendes:
als Test bei mir so aufgerufen:
So weit so gut. Nun sollen die Links aber ja aus dem Template generiert werden. Dazu habe ich in Jinja eine Schleife, in der ich die url_for-Funktion aufrufen möchte. Dazu habe ich auch die Funktion in die globals von meiner Jinja-Instanz gepackt. zusätzlich die dict()-Funktion, da ich ja die Nummer mit übergeben muss. Hier erst mal der Jinja-Code:
'karte' ist ja nun mein Alias für den Endpunkt und ident der zugehörige Parameter. Leider kommt letzterer nicht in der url_for()-Funktion an! Auf der Konsole bekomme ich folgendes:
Logisch, da es keine Regel '/karte' gibt.
Nun also meine Frage: Kann ich kein Dictionary aus Jinja heraus als Parameter einer Funktion übergeben? (Wobei das in der Jinja-Doc nicht explizit erwähnt wird) Oder mache ich das schlicht falsch? Oder ist es grundsätzlich eine schlechte Idee, das aus Jinja heraus machen zu wollen?
Ich hoffe ich konnte das halbwegs klar darstellen und habe keine wichtige Angabe vergessen. Wenn doch liefere ich das gerne nach.
mein Hirn ist zwar schon ein wenig heruntergefahren ob der Uhrzeit, aber ich stelle die Frage hier dann trotzdem noch.
Ich bin grad dabei eine kleine WSGI-Applikation mit Werkzeug und Jinja zu schreiben. Nun habe ich anscheinend aber ein Designproblem oder aber ein Verständnisproblem oder etwas anderes schlimmes

Also: Ich möchte eine URL zusammenbaslten und habe in einer utils.py Datei folgende Funktion:
Code: Alles auswählen
def url_for(endpoint, _external=False, **values):
return local.url_adapter.build(endpoint, values, force_external=_external)
Nun möchte ich auf meiner Hauptseite eine Liste von Links ausgeben, die zu Unterseiten führen, also der endpoint 'karte'. Der Aufbau der Links kann man aus der Definition der Regeln entnehmen:
Code: Alles auswählen
url_map=Map([
Rule("/", endpoint="index"),
Rule("/about", endpoint="about"),
Rule("/karte<string:ident>", endpoint="karte"),
Rule("/ziehung", endpoint="ziehung")
])
Code: Alles auswählen
/karte6
Code: Alles auswählen
print adapter.build("karte", dict(ident=6))
Code: Alles auswählen
{% for karte in karten %}
<li>
<a href="{{ url_for('karte', dict(ident=5))|e }}">{{ karte.name|e }}</a>
</li>
{% endfor %}
Code: Alles auswählen
....
File "/home/nelson/src/Python/karten/tarot/utils.py", line 15, in url_for
return local.url_adapter.build(endpoint, values, force_external=_external)
File "/usr/lib/python2.5/site-packages/Werkzeug-0.2-py2.5.egg/werkzeug/routing.py", line 1263, in build
raise BuildError(endpoint, values, method)
BuildError: ('karte', {}, 'GET')
Nun also meine Frage: Kann ich kein Dictionary aus Jinja heraus als Parameter einer Funktion übergeben? (Wobei das in der Jinja-Doc nicht explizit erwähnt wird) Oder mache ich das schlicht falsch? Oder ist es grundsätzlich eine schlechte Idee, das aus Jinja heraus machen zu wollen?
Ich hoffe ich konnte das halbwegs klar darstellen und habe keine wichtige Angabe vergessen. Wenn doch liefere ich das gerne nach.