Appeler une fonction python de jinja2
Je suis en utilisant jinja2, et je veux appeler une fonction python comme une aide, à l'aide d'une syntaxe similaire comme si je l'appel d'une macro. jinja2 semble décidée à m'empêcher de faire un appel de fonction, et insiste sur le fait de me répéter par la copie de la fonction dans un modèle comme une macro.
Est-il un moyen simple de faire cela? Et, est-il un moyen d'importer un ensemble de fonctions python et ont accessibles à partir de jinja2, sans passer par tout un tas de rigamarole (comme l'écriture d'une extension)?
Vous devez vous connecter pour publier un commentaire.
Pour ceux qui utilisent le Flacon, mettez ceci dans votre
__init__.py
:et dans votre modèle d'appeler avec des
{{ clever_function() }}
from jinja2 import Template ##newline## def clever_function(): ##newline## return "Hello" ##newline## template = Template("{{ clever_function() }}") ##newline## print(template.render(clever_function=clever_function))
Note: Ceci est un Flacon spécifique!
Je sais que ce post est assez vieux, mais il existe de meilleures façons de faire dans les versions plus récentes de la Fiole à l'aide de contexte processeurs.
Variables peuvent facilement être créés:
Ci-dessus peut être utilisé dans un Jinja2 modèle avec Flacon comme suit:
(Les sorties qui
This is an example
)Ainsi que de véritables fonctions:
Ci-dessus lorsqu'il est utilisé comme ainsi:
(Qui sort le prix des entrées avec le symbole de la devise)
Alternativement, vous pouvez utiliser jinja filtres, cuit dans la Fiole. E. g. à l'aide de décorateurs:
Ou, sans décorateurs, et enregistrer manuellement la fonction:
Les filtres appliqués, avec les deux méthodes peuvent être utilisées comme ceci:
__init__.py
en supposant que vous avez déclaréflask.Flask(__name__)
là.Je pense que jinja délibérément rend difficile l'exécuter "arbitraire" python à l'intérieur d'un modèle. Il tente de faire respecter l'opinion que moins de la logique dans les modèles est une bonne chose.
Vous pouvez manipuler l'espace de noms global au sein d'une
Environment
exemple pour ajouter des références à vos fonctions. Il doit être fait avant vous chargez l'un des modèles. Par exemple:import utils.helpers env.globals['helpers'] = utils.helpers
{{ clever_function('a', 'b') }}
Vous pouvez également donner à la fonction dans les champs à l' Matroskin réponse
Sera de sortie:
Fonctionne avec Jinja2 version 2.7.3
Et si vous voulez un décorateur pour faciliter la définition des fonctions sur
template.globals
découvrez Bruno Bronosky réponsejinga_html_template.globals['custom_function'] = custom_function
ligne. Fait une grande différence.J'aime @AJP réponse. Je l'ai utilisé verbatim jusqu'à ce que j'ai retrouvé avec beaucoup de fonctions. Puis je suis passé à un Fonction Python décorateur.
Bonne chose fonctions ont une
__name__
!N'a jamais vu une telle façon simple à l'officiel de docs ou à débordement de pile, mais j'ai été étonné quand trouvé ceci:
Utiliser une lambda pour connecter le modèle de votre code principal
Ensuite, vous pouvez appeler la fonction dans le modèle
Pour appeler une fonction python de Jinja2, vous pouvez utiliser des filtres personnalisés qui fonctionnent de la même façon que les variables globales:
http://jinja.pocoo.org/docs/dev/api/#writing-filters
C'est très simple et utile.
Dans un fichier myTemplate.txt j'ai écrit:
Et dans un script python:
est-il possible d'importer tout un ensemble de fonctions python et ont accessibles à partir de jinja2 ?
Oui, il est, En plus d'autres réponses ci-dessus, cela fonctionne pour moi.
Créer une classe et le remplir avec les méthodes associées.e.g
Ensuite créer une instance de votre classe, de votre point de vue de la fonction et de passer la résultante de l'objet de votre modèle en tant que paramètre de la render_template fonction
Maintenant dans votre modèle, vous pouvez appeler les méthodes de la classe à jinja, comme
Si vous le faites avec Django, vous pouvez juste passer à la fonction du contexte:
De maintenant, vous serez en mesure d'utiliser le
str
fonction dans jinja2 modèlePour importer toutes les fonctions internes, vous pouvez utiliser:
Ajouter
.__dict__
après__builtins__
si cela ne fonctionne pas.Basé sur John32323 réponse.