Python 烧瓶无法导入枚举?未定义错误:';枚举';是未定义的

Python 烧瓶无法导入枚举?未定义错误:';枚举';是未定义的,python,flask,jinja2,Python,Flask,Jinja2,我只是在HTML页面中编写此代码 {% for i, val in enumerate(['a', 'b', 'c']) %} <td> {{ val }} </td> {% endfor %} UndefinedError: 'enumerate' is undefined {%fori,val在枚举(['a','b','c'])中的百分比] {{val}} {%endfor%} UndefinedError:“枚举”未定义 因此,

我只是在HTML页面中编写此代码

{% for i, val in enumerate(['a', 'b', 'c']) %}
    <td>
        {{ val }}
    </td>
{% endfor %}

UndefinedError: 'enumerate' is undefined
{%fori,val在枚举(['a','b','c'])中的百分比]
{{val}}
{%endfor%}
UndefinedError:“枚举”未定义

因此,Flask不支持enumerate?

Flask使用Jinja2呈现模板,Jinja2具有类似的python语法,但它不是python

你能做什么?在python代码中:

my_dict = enumerate(some_list)
然后,在呈现模板时,将dict发送给模板:

render_template('page.html', my_dict=my_dict)

正如或段所说,金甲2有自己的语言。看起来像Python,但不是Python。因此Python
enumerate
内置函数不是Jinja2模板引擎的一部分。但是,您可以使用一些替代方案:

如果要枚举列表中的项目,可以使用loop特殊变量:

>>> from jinja2 import Template

>>> t1 = """
... {% for val in ['a', 'b', 'c'] %}
...     <td>
...         {{ loop.index0 }} {{ val }}
...     </td>
... {% endfor %}
... """
>>> Template(t1).render()
Flask允许通过将变量自动注入模板的上下文中。因此,如果您希望
enumerate
内置函数可用于所有模板,这可能是一个不错的解决方案:

@app.context_processor
def inject_enumerate():
    return dict(enumerate=enumerate)

感谢Sean Vieira的建议。

还有一个选择是注册一个上下文处理器,并在Jinja环境中从Python中公开您想要的内容。很好的列表,顺便说一句。@SeanVieira很好的解决方案。我将该选项添加到列表中。希望这是你的意思。谢谢你的回答。我挣扎着去理解它——我需要足够的时间去弄清楚什么是
Template().render(某物)
。所以还有改进的余地。谢谢大家的解决方案。值得一提的是,
loop.index
也存在于index
1
而不是
loop.index0
0
开始。非常感谢。但我认为在枚举的情况下,
loop.index0
可以实现这一点。
>>> t3 = """
... {% for i, val in enumerate(['a', 'b', 'c']) %}
...     <td>
...         {{ i }} {{ val }}
...     </td>
... {% endfor %}
... """
>>> Template(t3).render(enumerate=enumerate)
@app.context_processor
def inject_enumerate():
    return dict(enumerate=enumerate)