Używam jinja2 i chcę wywołać funkcję Pythona jako pomocnika, używając podobnej składni, jak gdybym wywoływał makro. jinja2 wydaje się mieć zamiar uniemożliwić mi wywołanie funkcji i nalega, abym się powtarzał, kopiując funkcję do szablonu jako makro.
Czy jest na to prosty sposób? I czy istnieje sposób na zaimportowanie całego zestawu funkcji Pythona i udostępnienie ich z jinja2 bez przechodzenia przez całą masę rygorolek (takich jak pisanie rozszerzenia)?
from jinja2 import Template ##newline## def clever_function(): ##newline## return "Hello" ##newline## template = Template("{{ clever_function() }}") ##newline## print(template.render(clever_function=clever_function))
Uwaga: to jest specyficzne dla Flask!
Wiem, że ten post jest dość stary, ale w nowszych wersjach Flaska są lepsze metody na zrobienie tego przy użyciu procesorów kontekstu.
Zmienne można łatwo tworzyć:
Powyższe może być użyte w szablonie Jinja2 z Flask w następujący sposób:
(Które wyjścia
This is an example
)Oprócz pełnoprawnych funkcji:
Powyższe użyte w ten sposób:
(Który podaje cenę wejściową z symbolem waluty)
Alternatywnie możesz użyć filtrów jinja wypieczonych w Flasku. Np. Przy użyciu dekoratorów:
Lub bez dekoratorów i ręcznie rejestrując funkcję:
Filtry zastosowane dwiema powyższymi metodami mogą być używane w następujący sposób:
źródło
__init__.py
zakładając, żeflask.Flask(__name__)
tam zadeklarowałeś .Myślę, że jinja celowo utrudnia uruchomienie „dowolnego” Pythona w szablonie. Próbuje narzucić opinię, że mniej logiki w szablonach to dobra rzecz.
Możesz manipulować globalną przestrzenią nazw w
Environment
instancji, aby dodawać odwołania do funkcji. Należy to zrobić przed załadowaniem jakichkolwiek szablonów. Na przykład:źródło
import utils.helpers env.globals['helpers'] = utils.helpers
{{ clever_function('a', 'b') }}
Możesz również podać funkcję w polach zgodnie z odpowiedzią Matroskina
Wyświetli:
Działa z Jinja2 w wersji 2.7.3
A jeśli chcesz, aby dekorator ułatwił definiowanie funkcji,
template.globals
zapoznaj się z odpowiedzią Bruno Bronosky'egoźródło
Podoba mi się odpowiedź @ AJP . Używałem go dosłownie, aż skończyło się na wielu funkcjach. Następnie przełączyłem się na dekorator funkcji Pythona .
Dobre funkcje mają
__name__
!źródło
Nigdy nie widziałem tak prostego sposobu w oficjalnych dokumentach ani przy przepełnieniu stosu, ale byłem zdumiony, gdy znalazłem to:
źródło
Użyj lambdy, aby połączyć szablon z głównym kodem
Następnie możesz bezproblemowo wywołać funkcję w szablonie
źródło
Aby wywołać funkcję Pythona z Jinja2, możesz użyć niestandardowych filtrów, które działają podobnie jak globalne: http://jinja.pocoo.org/docs/dev/api/#writing-filters
To całkiem proste i przydatne. W pliku myTemplate.txt napisałem:
A w skrypcie Pythona:
źródło
czy istnieje sposób na zaimportowanie całego zestawu funkcji Pythona i udostępnienie ich w jinja2?
Tak, oprócz innych odpowiedzi powyżej, to działa dla mnie.
Utwórz klasę i wypełnij ją powiązanymi metodami, np
Następnie utwórz instancję swojej klasy w funkcji widoku i przekaż wynikowy obiekt do szablonu jako parametr funkcji render_template
Teraz w swoim szablonie możesz wywoływać metody klas w jinja w ten sposób
źródło
Aby zaimportować wszystkie wbudowane funkcje, których możesz użyć:
Dodaj
.__dict__
po__builtins__
jeśli to nie zadziała.Na podstawie odpowiedzi John32323 .
źródło
Jeśli robisz to z Django, możesz po prostu przekazać funkcję z kontekstem:
Teraz będziesz mógł korzystać z
str
funkcji w szablonie jinja2źródło
Jest o wiele prostsza decyzja.
Następnie w pliku test.html :
źródło