Estoy usando jinja2, y quiero llamar a una función de python como ayudante, usando una sintaxis similar a la de una macro. Parece que jinja2 intenta evitar que haga una llamada a una función, e insiste en que me repita copiando la función en una plantilla como una macro.
¿Hay alguna forma directa de hacer esto? Y, ¿hay alguna manera de importar un conjunto completo de funciones de Python y tenerlas accesibles desde jinja2, sin pasar por un montón de rigamarole (como escribir una extensión)?
from jinja2 import Template ##newline## def clever_function(): ##newline## return "Hello" ##newline## template = Template("{{ clever_function() }}") ##newline## print(template.render(clever_function=clever_function))
Nota: ¡Esto es específico de Flask!
Sé que esta publicación es bastante antigua, pero hay mejores métodos para hacerlo en las versiones más recientes de Flask usando procesadores de contexto.
Las variables se pueden crear fácilmente:
Lo anterior se puede usar en una plantilla Jinja2 con Flask así:
(Que salidas
This is an example
)Además de las funciones completas:
Lo anterior cuando se usa así:
(Que genera el precio de entrada con el símbolo de moneda)
Alternativamente, puede usar filtros jinja , horneados en Flask. Por ejemplo, usar decoradores:
O, sin decoradores, y registrando manualmente la función:
Los filtros aplicados con los dos métodos anteriores se pueden usar así:
fuente
__init__.py
asumiendo que declarasteflask.Flask(__name__)
allí.Creo que jinja deliberadamente hace que sea difícil ejecutar python 'arbitrario' dentro de una plantilla. Intenta imponer la opinión de que menos lógica en las plantillas es algo bueno.
Puede manipular el espacio de nombres global dentro de una
Environment
instancia para agregar referencias a sus funciones. Debe hacerse antes de cargar cualquier plantilla. Por ejemplo:fuente
import utils.helpers env.globals['helpers'] = utils.helpers
{{ clever_function('a', 'b') }}
También puede asignar la función en los campos según la respuesta de Matroskin
Saldrá:
Funciona con Jinja2 versión 2.7.3
Y si desea un decorador para facilitar la definición de funciones al
template.globals
consultar la respuesta de Bruno Bronoskyfuente
Me gusta la respuesta de @ AJP . Lo usé textualmente hasta que terminé con muchas funciones. Luego me cambié a un decorador de funciones de Python .
Lo bueno es que las funciones tienen un
__name__
!fuente
Nunca vi una manera tan simple en los documentos oficiales o en el desbordamiento de la pila, pero me sorprendió cuando encontré esto:
fuente
Use una lambda para conectar la plantilla a su código principal
Luego puede llamar sin problemas a la función en la plantilla
fuente
Para llamar a una función de Python desde Jinja2, puede usar filtros personalizados que funcionan de manera similar a los globales: http://jinja.pocoo.org/docs/dev/api/#writing-filters
Es bastante simple y útil. En un archivo myTemplate.txt, escribí:
Y en un script de python:
fuente
¿Hay alguna manera de importar un conjunto completo de funciones de Python y tenerlas accesibles desde jinja2?
Sí, hay, además de las otras respuestas anteriores, esto funciona para mí.
Cree una clase y complétela con los métodos asociados, p. Ej.
Luego cree una instancia de su clase en su función de vista y pase el objeto resultante a su plantilla como parámetro para la función render_template
Ahora en su plantilla, puede llamar a los métodos de clase en jinja así
fuente
Para importar todas las funciones integradas que puede usar:
Agregue
.__dict__
después__builtins__
si esto no funciona.Basado en la respuesta de John32323 .
fuente
Si lo está haciendo con Django, puede pasar la función con el contexto:
Ahora podrá usar la
str
función en la plantilla jinja2fuente
Hay una decisión mucho más simple.
Luego, en test.html :
fuente