我正在尝试将一些旧的Smarty模板转换为Jinja2。
Smarty在模板中使用eval
语句从当前上下文渲染一个模板字符串。
Jinja2中是否有类似于eval
的等效功能?或者有什么好的解决方法?
from flask import render_template_string
from jinja2 import contextfilter
from markupsafe import Markup
@contextfilter
def dangerous_render(context, value):
Markup(render_template_string(value, **context)).format()
{{ myvar|dangerous_render }}
import jinja2
@jinja2.pass_context
def filter_eval(context, input, **vars):
if input == jinja2.Undefined:
return input
return jinja2.Template(input).render(context, **vars)
使用时,将filter_eval()作为"eval"过滤器添加:
模板源代码:
{% set rack_str = 'Rack {{ rack }}' %}
{{ rack_str | eval(rack='A') }}
渲染后的模板:
Rack A
routes.py
def index():
html = "<b>actual eval string</b>"
return render_template('index.html', html_str = html)
index.html
<html>
<head>
<title>eval jinja</title>
</head>
<body>
{{ html_str | safe }}
</body>
</html>
如果您正在使用jinja 3.0版本,则contextfilter已被弃用并在Jinja 3.1中删除。请改用pass_context()。请参阅此处以获取更多相关细节。
from jinja2 import pass_context, Template
from markupsafe import Markup
@pass_context
def foo(context, value):
return Markup(Template(value).render(context)).render()
然后在你的模板中
{{ myvar|foo }}
Markup(...)
上的 render()
方法对我无效,我认为它没有这个方法。 - Andreas Maier
Markup(...)
上的render()
方法对我无效,我认为它没有这个方法。 - Andreas Maier