jinja2中的随机过滤器每次都重用相同的值

时间:2017-07-07 07:44:21

标签: python random jinja2

我正试图在jinja2中随机选取一个值,这样:

{{ ['#EDD7C9', '#EDD7C9', '#EEE'] | random }}

它随机选择一个元素,但每次都会重复使用它。如果我在模板中更改了某些内容,那么它会再次获取不同的数字。

但奇怪的是,如果我使用范围,它可以正常工作:

{{ range(1,100) |random }}

关于如何从固定列表中选择随机项而不必创建自己的过滤器的任何想法?

只是添加一个更完整的例子:

{% for i in range(5) %}
    {{ ['#EDD7C9', '#EDD7C9', '#EEE'] | random }} 
    {{ range(1,100) | random }} <br/>
{% endfor %}

输出:

#EEE 8

#EEE 61

#EEE 58

#EEE 64

#EEE 76

任何帮助表示赞赏! 谢谢:))

1 个答案:

答案 0 :(得分:0)

这似乎是Jinja 2.9中引入的错误。我可以用任何2.9版本(2.9 - 2.9.6)重现它。 Jinja 2.8和Jinja 2.8.1工作正常,随机值在渲染中混合:

$ cat test.py
from jinja2 import Template
template = Template('''
{%- for i in range(10) -%}
{{ ['foo', 'bar', 'baz', 'eggs', 'ham', 'spam'] | random }}{{ ' ' }}
{%- endfor %}
''')
print(template.render())
$ bin/python test.py    
eggs eggs eggs eggs eggs eggs eggs eggs eggs eggs
$ bin/pip -U Jinja2==2.8.1
Collecting jinja2==2.8.1
  Using cached Jinja2-2.8.1-py2.py3-none-any.whl
Requirement already up-to-date: MarkupSafe in ./lib/python3.6/site-packages (from jinja2==2.8.1)
Installing collected packages: jinja2
  Found existing installation: Jinja2 2.9
    Uninstalling Jinja2-2.9:
      Successfully uninstalled Jinja2-2.9
Successfully installed jinja2-2.8.1
$ bin/python test.py
spam ham eggs spam spam eggs eggs baz bar foo

请注意,此仅适用于后直接使用random嵌入模板的列表文字。如果您将列表作为变量传入,那么每次都会获得random()结果;该变量也可以使用{% set ... %}在模板中设置。看来模板编译器正在某处优化一步。

所以现在的解决方法是:

  • 使用{% set seq = ['#EDD7C9', '#EDD7C9', '#EEE'] %}{{ seq | random }}
  • 将列表作为变量传入模板,并将random应用于该
  • 降级至2.8.1。

我已经向issue #739提交了跟踪此项目的项目。维护人员具有出色的时间技能并已修复此问题a day ahead of time。未来版本将包括此修复程序(无论是2.9.7还是2.10)。