Estou usando jinja2 e quero chamar uma função python como auxiliar, usando uma sintaxe semelhante como se estivesse chamando uma macro. O jinja2 parece ter a intenção de impedir que eu faça uma chamada de função e insiste em que eu repita copiando a função em um modelo como uma macro.
Existe alguma maneira simples de fazer isso? E, existe alguma maneira de importar todo um conjunto de funções python e torná-las acessíveis a partir do jinja2, sem passar por um monte de rigamarole (como escrever uma extensão)?
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: Isso é específico para o frasco!
Eu sei que este post é bastante antigo, mas existem métodos melhores para fazer isso nas versões mais recentes do Flask usando processadores de contexto.
Variáveis podem ser facilmente criadas:
O acima pode ser usado em um modelo Jinja2 com o Flask da seguinte forma:
(Quais saídas
This is an example
)Bem como funções de pleno direito:
A descrição acima, quando usada da seguinte maneira:
(Que gera o preço de entrada com o símbolo da moeda)
Como alternativa, você pode usar filtros jinja , inseridos no Flask. Por exemplo, usando decoradores:
Ou, sem decoradores, e registrando manualmente a função:
Os filtros aplicados com os dois métodos acima podem ser usados assim:
fonte
__init__.py
assumindo que você declarouflask.Flask(__name__)
lá.Eu acho que o jinja deliberadamente dificulta a execução de python 'arbitrário' dentro de um modelo. Ele tenta reforçar a opinião de que menos lógica nos modelos é uma coisa boa.
Você pode manipular o espaço para nome global em uma
Environment
instância para adicionar referências às suas funções. Isso deve ser feito antes de você carregar qualquer modelo. Por exemplo:fonte
import utils.helpers env.globals['helpers'] = utils.helpers
{{ clever_function('a', 'b') }}
Você também pode fornecer a função nos campos conforme a resposta de Matroskin
Saída:
Funciona com o Jinja2 versão 2.7.3
E se você quer um decorador para facilitar a definição de funções,
template.globals
confira a resposta de Bruno Bronoskyfonte
Eu gosto da resposta da @ AJP . Eu o usei literalmente até terminar com muitas funções. Então mudei para um decorador de funções Python .
Coisa boa funções têm um
__name__
!fonte
Nunca vi uma maneira tão simples em documentos oficiais ou no estouro de pilha, mas fiquei surpreso ao encontrar isso:
fonte
Use um lambda para conectar o modelo ao seu código principal
Em seguida, você pode chamar perfeitamente a função no modelo
fonte
Para chamar uma função python do Jinja2, você pode usar filtros personalizados que funcionam da mesma forma que os globais: http://jinja.pocoo.org/docs/dev/api/#writing-filters
É bastante simples e útil. Em um arquivo myTemplate.txt, escrevi:
E em um script python:
fonte
existe alguma maneira de importar todo um conjunto de funções python e tê-las acessíveis a partir do jinja2?
Sim, existe. Além das outras respostas acima, isso funciona para mim.
Crie uma classe e preencha-a com os métodos associados, por exemplo
Em seguida, crie uma instância da sua classe na sua função view e passe o objeto resultante para o seu template como um parâmetro para a função render_template
Agora, no seu modelo, você pode chamar os métodos de classe no jinja dessa maneira
fonte
Para importar todas as funções internas, você pode usar:
Adicione
.__dict__
depois__builtins__
se isso não funcionar.Com base na resposta de John32323 .
fonte
Se você estiver fazendo isso com o Django, basta passar a função com o contexto:
Agora você poderá usar a
str
função no modelo jinja2fonte
Há uma decisão muito mais simples.
Então, em test.html :
fonte