194 votes

Appeler une fonction python depuis jinja2

Je suis à l'aide de 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)?

261voto

John32323 Points 541

Pour ceux qui utilisent Flask, mettez ceci dans votre __init__.py :

 def clever_function():
    return u'HELLO'

app.jinja_env.globals.update(clever_function=clever_function)
 

et dans votre modèle, appelez-le avec {{ clever_function() }}

165voto

Liam Stanley Points 315

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.

Les Variables peuvent facilement être créés:

@app.context_processor
def example():
    return dict(myexample='This is an example')

Le ci-dessus peut être utilisé dans un Jinja2 modèle avec Flacon comme suit:

{{ myexample }}

(Les sorties qui This is an example)

Ainsi que plein de fonctions:

@app.context_processor
def utility_processor():
    def format_price(amount, currency=u'€'):
        return u'{0:.2f}{1}'.format(amount, currency)
    return dict(format_price=format_price)

Le ci-dessus lorsqu'il est utilisé comme ainsi:

{{ format_price(0.33) }}

(Les sorties qui le prix des entrées avec le symbole de la devise)

93voto

Rob Cowie Points 10471

Je pense que jinja rend délibérément difficile la gestion de python "arbitraire" dans un modèle. Il essaie de renforcer l'opinion selon laquelle moins de logique dans les modèles est une bonne chose.

Vous pouvez manipuler l'espace de noms global au sein d'une instance Environment pour ajouter des références à vos fonctions. Cela doit être fait avant de charger des modèles. Par exemple:

 from jinja2 import Environment, FileSystemLoader

def clever_function(a, b):
    return u''.join([b, a])

env = Environment(loader=FileSystemLoader('/path/to/templates'))
env.globals['clever_function'] = clever_function
 

7voto

Robert Onslow Points 45

Utilisez un lambda pour connecter le modèle à votre code principal

 return render_template("clever_template", clever_function=lambda x: clever_function x)
 

Ensuite, vous pouvez appeler de manière transparente la fonction dans le modèle

 {{clever_function(value)}}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X