Jinja在可变内容上嵌套渲染

muc*_*out 6 python jinja2

假设我在变量X中有实际的jinja模板代码.让我们说X的内容是"{{some_other_variable}}".

如何在呈现内容的同时显示X?

例如,这不起作用:

{{ X }}

因为它只是将其渲染为"{{some_other_variable}}"而不是some_other_variable的内容.

我这样做的原因是我有一个网站,其中(可信的)用户可以创建自己可能包含jinja模板代码的帖子.视图页面显示这些帖子,但由于上述问题,直接呈现它们,而不是按照我的意愿替换变量.

小智 6

我知道这有点晚了:),但这是一个不影响模板代码的解决方案:

import jinja2
def recursive_render(tpl, values):
     prev = tpl
     while True:
         curr = jinja2.Template(prev).render(**values)
         if curr != prev:
             prev = curr
         else:
             return curr
Run Code Online (Sandbox Code Playgroud)

测试运行:

>>> recursive_render("Hello {{X}}!", dict(X="{{name}}", name="world"))
u'Hello world!'
Run Code Online (Sandbox Code Playgroud)

请注意,这不是非常有效,因为必须在每次迭代中从头开始重新分析模板。


ngl*_*inh 0

我找不到执行此嵌套渲染的好方法,但是,我可能会尝试建议替代方案:

由于用户创建了帖子,我想“{{some_other_variable}}”实际上是整个帖子的子字符串,这也是一个字符串。

我会做:

X.replace("{{some_other_variable}}", some_other_variable))
Run Code Online (Sandbox Code Playgroud)

然后正常返回 {{X}}。这能满足你想做的事情吗?