I've been using macros in Jinja2 extensively and find them very DRY-ish; but there is one thing bothering me: how to access global stuff from macros? It would be really neat if I could somehow access url_for() natively from a macro.
Macros are similar to functions in many programming languages. We use them to encapsulate logic used to perform repeatable actions. Macros can take arguments or be used without them. Inside of macros we can use any of the Jinja features and constructs. Result of running macro is some text.
You can make any callable available in the Jinja environment:
jinja_env = Environment(...)
jinja_env.globals['url_for'] = url_for
For example, this output u'foobar' in a shell:
from jinja2 import Environment
env = Environment()
env.globals['foo'] = lambda: "foobar"
env.from_string('{% macro bar() %}{{ foo() }}{% endmacro %}{{ bar() }}').render()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With