Ich verwende jinja2 und möchte eine Python-Funktion als Helfer aufrufen, wobei ich eine ähnliche Syntax verwende, als würde ich ein Makro aufrufen. jinja2 scheint darauf bedacht zu sein, mich daran zu hindern, einen Funktionsaufruf zu tätigen, und besteht darauf, dass ich mich wiederhole, indem ich die Funktion als Makro in eine Vorlage kopiere.
Gibt es eine einfache Möglichkeit, dies zu tun? Und gibt es eine Möglichkeit, eine ganze Reihe von Python-Funktionen zu importieren und über jinja2 zugänglich zu machen, ohne viel Rigamarole zu durchlaufen (z. B. eine Erweiterung zu schreiben)?
from jinja2 import Template ##newline## def clever_function(): ##newline## return "Hello" ##newline## template = Template("{{ clever_function() }}") ##newline## print(template.render(clever_function=clever_function))
Hinweis: Dies ist flaschenspezifisch!
Ich weiß, dass dieser Beitrag ziemlich alt ist, aber es gibt bessere Methoden, dies in den neueren Versionen von Flask unter Verwendung von Kontextprozessoren zu tun.
Variablen können einfach erstellt werden:
Das Obige kann in einer Jinja2-Vorlage mit Flask wie folgt verwendet werden:
(Welche Ausgänge
This is an example
)Sowie vollwertige Funktionen:
Das obige, wenn es so verwendet wird:
(Welches gibt den Eingabepreis mit dem Währungssymbol aus)
Alternativ können Sie Jinja-Filter verwenden , die in Flask eingebrannt sind. ZB mit Dekorateuren:
Oder ohne Dekorateure und manuelles Registrieren der Funktion:
Filter, die mit den beiden oben genannten Methoden angewendet werden, können folgendermaßen verwendet werden:
quelle
__init__.py
vorausgesetzt, Sie haben dort erklärtflask.Flask(__name__)
.Ich denke, Jinja macht es absichtlich schwierig, "beliebige" Python innerhalb einer Vorlage auszuführen. Es wird versucht, die Meinung durchzusetzen, dass weniger Logik in Vorlagen eine gute Sache ist.
Sie können den globalen Namespace innerhalb einer
Environment
Instanz bearbeiten, um Verweise auf Ihre Funktionen hinzuzufügen. Dies muss erfolgen, bevor Sie Vorlagen laden. Beispielsweise:quelle
import utils.helpers env.globals['helpers'] = utils.helpers
{{ clever_function('a', 'b') }}
Sie können die Funktion auch in den Feldern gemäß der Antwort von Matroskin angeben
Wird ausgegeben:
Funktioniert mit Jinja2 Version 2.7.3
Und wenn Sie möchten, dass ein Dekorateur die Definition von Funktionen erleichtert, lesen Sie die Antwort
template.globals
von Bruno Bronoskyquelle
Ich mag die Antwort von @ AJP . Ich habe es wörtlich verwendet, bis ich viele Funktionen hatte. Dann wechselte ich zu einem Python-Funktionsdekorateur .
Gut, dass Funktionen eine haben
__name__
!quelle
Ich habe noch nie einen so einfachen Weg bei offiziellen Dokumenten oder beim Stapelüberlauf gesehen, aber ich war erstaunt, als ich Folgendes fand:
quelle
Verwenden Sie ein Lambda, um die Vorlage mit Ihrem Hauptcode zu verbinden
Dann können Sie die Funktion in der Vorlage nahtlos aufrufen
quelle
Um eine Python-Funktion von Jinja2 aus aufzurufen, können Sie benutzerdefinierte Filter verwenden, die ähnlich wie die globalen funktionieren: http://jinja.pocoo.org/docs/dev/api/#writing-filters
Es ist ganz einfach und nützlich. In einer Datei myTemplate.txt schrieb ich:
Und in einem Python-Skript:
quelle
Gibt es eine Möglichkeit, eine ganze Reihe von Python-Funktionen zu importieren und über jinja2 darauf zugreifen zu können?
Ja, zusätzlich zu den anderen Antworten oben funktioniert dies für mich.
Erstellen Sie eine Klasse und füllen Sie sie mit den zugehörigen Methoden, z
Erstellen Sie dann eine Instanz Ihrer Klasse in Ihrer Ansichtsfunktion und übergeben Sie das resultierende Objekt als Parameter für die Funktion render_template an Ihre Vorlage
Jetzt können Sie in Ihrer Vorlage die Klassenmethoden in jinja so aufrufen
quelle
So importieren Sie alle integrierten Funktionen:
Fügen Sie
.__dict__
nach ,__builtins__
wenn dies nicht funktioniert.Basierend auf der Antwort von John32323 .
quelle
Wenn Sie es mit Django machen, können Sie die Funktion einfach mit dem Kontext übergeben:
Jetzt können Sie die
str
Funktion in der jinja2-Vorlage verwendenquelle
Es gibt eine viel einfachere Entscheidung.
Dann in test.html :
quelle