Wenn ich wieder eine Jinja2 Vorlage wie folgt: return render_response('home.htm', **context)
Wie bekomme ich eine Liste der aktuellen Variablen von Jinja 2 Vorlage?
Wie erhält dann eine Liste der Variablen im Kontext von in der Vorlage?
Wenn ich wieder eine Jinja2 Vorlage wie folgt: return render_response('home.htm', **context)
Wie bekomme ich eine Liste der aktuellen Variablen von Jinja 2 Vorlage?
Wie erhält dann eine Liste der Variablen im Kontext von in der Vorlage?
Da der Kontext nicht als benanntes Wörterbuch übergeben wird, ist ein wenig Arbeit erforderlich, um eine Liste der Kontextvariablen aus einer Vorlage zu erstellen. Es ist jedoch möglich.
definieren Jinja context function das jinja2.Context Objekt zurück, das im Wesentlichen ein Wörterbuch der globalen Variablen ist/Funktionen
Sie sich, dass Funktion im globalen Namensraum zur Verfügung; d. h. ein jinja2.Environment- oder jinja2.Template-globals-Wörterbuch
Optional können Sie Objekte aus dem Kontext filtern; Verwenden Sie zum Beispiel callable()
, um Jinjas globale Hilfsfunktionen (Bereich, Joiner usw.) zu überspringen. Dies kann in der Kontextfunktion oder der Vorlage erfolgen; wo auch immer es am sinnvollsten ist.
Beispiel:
>>> import jinja2
>>>
>>> @jinja2.contextfunction
... def get_context(c):
... return c
...
>>> tmpl = """
... {% for key, value in context().items() %}
... {% if not callable(value) %}
... {{ key }}:{{ value }}
... {% endif %}
... {% endfor %}
... """
>>>
>>> template = jinja2.Template(tmpl)
>>> template.globals['context'] = get_context
>>> template.globals['callable'] = callable
>>>
>>> context = {'a': 1, 'b': 2, 'c': 3}
>>>
>>> print(template.render(**context))
a:1
c:3
b:2
[Alternativ render_response
mit ('home.htm', context=context)
rufen die andere Lösung funktioniert.]
Vielen Dank. Ich verneige mich vor deinem überlegenen Jinja2-Wissen. – Christian
Beachten Sie, dass Ihre Lösung aufgrund der "aufrufbaren" Prüfung Funktionen ignoriert, die explizit als Teil des Kontextes übergeben wurden. Wahrscheinlich nicht oft, aber könnte einen Unterschied machen. –
Wahr. Diese einfache Lösung kann definitiv verbessert werden. Zum Beispiel, wenn '' template'' ein globales '' get_context() '' ist, kann ein neues Wörterbuch basierend auf '' context'' aber ohne Schlüssel, die auch in '' template.globals' existieren, zurückgeben. – Garrett
Hier ist, wie @crewbum's answer Arbeit von einer Flasche App zu bekommen:
import jinja2
@jinja2.contextfunction
def get_context(c):
return c
app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable
Wo stellst du das hin? – johnny
In der App-Initialisierung (oder App-Factory). Wenn Sie Flaschenverlängerungen verwenden, wie zum Beispiel flaschen-sqlalchemy, flaschen-login usw., können Sie sich dort befinden, wo sie erstellt wurden. –
Wie wäre es mit Readin g die Vorlagenquelle? Was stimmt damit nicht? –