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

Python jinja2中的随机过滤器每次都重复使用相同的值,python,random,jinja2,Python,Random,Jinja2,我试图从jinja2中的列表中随机选取一个值,方法如下: {{ ['#EDD7C9', '#EDD7C9', '#EEE'] | random }} 它随机选择一个元素,但每次都会重用它。如果我在模板中更改了某些内容,那么它会再次拾取不同的数字 但奇怪的是,如果我使用range,它就可以正常工作: {{ range(1,100) |random }} 有没有想过如何从固定列表中随机选取一个项目,而不必创建自己的过滤器 只需添加一个更完整的示例: {% for i in range(5) %}

我试图从jinja2中的列表中随机选取一个值,方法如下:

{{ ['#EDD7C9', '#EDD7C9', '#EEE'] | random }}
它随机选择一个元素,但每次都会重用它。如果我在模板中更改了某些内容,那么它会再次拾取不同的数字

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

{{ 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

感谢您的帮助!
谢谢:

这似乎是Jinja2.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。如果您将列表作为变量传递,那么每次都会得到一个随机结果;也可以在模板中使用{%set…%}设置该变量。模板编译器似乎在某个地方优化了一步

因此,目前的解决办法是:

使用{%set seq=['EDD7C9','EDD7C9','EEE']%}和{{seq | random} 将列表作为变量传递到模板中,并对其应用随机变量 或降级至2.8.1。
我已经向项目提交了跟踪文件。维护人员具有出色的时间技能,并且已经解决了这一问题。将来的版本将包括此修补程序,无论是2.9.7还是2.10。

您确定浏览器不会缓存页面吗?random会按照tin上的说明进行操作,但是您的结果仍然可以缓存到其他地方。但是使用range时,它也不应该工作,不是吗?我还在for循环中使用它,所以我至少应该在循环中得到不同的值。这取决于你在哪里使用它。你并没有在这里为我们创建一个很好的方法来验证这种行为。但我从来没有遇到过Random的问题。没错,我加了一个例子:我不能复制这个。我得了两次EEE,三次EDD7C9。Jinja2的哪个版本,Python的哪个版本?@Earthling:这个变量可以在模板中用{%set var=…%}设置。