Jinja: Jinja2 NativeEnvironment 在模板中的元素之间删除单引号以进行渲染

创建于 2019-06-19  ·  1评论  ·  资料来源: pallets/jinja

预期行为

>>> from jinja2 import Template
>>> template = Template("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> template.render(foo='foobar', bar='barbaz', baz='bazfoo')
('foobar', 'barbaz', 'bazfoo')

实际行为

>>> from jinja2.nativetypes import NativeEnvironment
>>> e = NativeEnvironment()
>>> t = e.from_string("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> t.render(foo='foobar', bar='barbaz', baz='bazfoo')
'foobar, barbaz, bazfoo'

您的环境

  • Python版本:2.7.5
  • Jinja 版本:2.10、2.10.1,当前主

试图找到对上述内容的解释。 在解释器中对此进行了测试,以将其缩小到仅 Jinja2,而没有其他可能调用它的东西,例如将 jinja2_native 设置为 True 的 Ansible。

当不使用 jinja2_native 时,我们得到了上面的预期行为,即三个替换发生在每个值周围用单引号引起来。 当 jinja2_native 设置为 true 时(在如上所示的 NativeEnvironment 中),字符串中的内部单引号将被忽略,并返回带有三个替换的单个字符串。

即使单引号之间有附加字符,也会发生这种情况:

>>> e = NativeEnvironment()
>>> t = e.from_string("--foo='{{ foo }}' --bar='{{ bar }}'")
>>> t.render(foo='foobar', bar='barbaz')
u"--foo='foobar --bar=barbaz'"

任何帮助,将不胜感激。

最有用的评论

添加一点关于为什么会发生这种情况(或多或少)的注释:模板"--foo='{{ foo }}' --bar='{{ bar }}'"被分解为以下节点:

  1. --foo='
  2. {{ foo }}
  3. ' --bar='
  4. {{ bar }}
  5. '"

问题发生在native_concat处理 3. ' --bar='literal_eval那里看到一个字符串,去掉引号并返回--bar=这是正确的,只是不在这种情况:)

@davidism 有什么想法吗?

>所有评论

添加一点关于为什么会发生这种情况(或多或少)的注释:模板"--foo='{{ foo }}' --bar='{{ bar }}'"被分解为以下节点:

  1. --foo='
  2. {{ foo }}
  3. ' --bar='
  4. {{ bar }}
  5. '"

问题发生在native_concat处理 3. ' --bar='literal_eval那里看到一个字符串,去掉引号并返回--bar=这是正确的,只是不在这种情况:)

@davidism 有什么想法吗?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

dwt picture dwt  ·  3评论

mtrstudio picture mtrstudio  ·  5评论

jp-costa picture jp-costa  ·  5评论

glasserc picture glasserc  ·  4评论

DriverX picture DriverX  ·  4评论