如何直接从 Flask render_template 使用 Jinja2 扩展

cya*_*ann 2 python jinja2 flask

我正在开发一个运行良好的 Flask 应用程序,直到我尝试将以下行添加到要渲染的模板中:

{% do totals.update({tier: 0}) %}
Run Code Online (Sandbox Code Playgroud)

当前渲染模板的代码使用 Flask 的render_template()

from flask import Flask, Response, request, session
from flask import render_template
app = Flask(__name__)

..
return render_template(<template.htlm>,...)
Run Code Online (Sandbox Code Playgroud)

此操作失败并出现以下错误:

TemplateSyntaxError: Encountered unknown tag 'do'. Jinja was looking for the following tags: 'endfor' or 'else'. The innermost block that needs to be closed is 'for'.
Run Code Online (Sandbox Code Playgroud)

明显的解决方法是将jinja2.ext.do扩展添加到 jinja。我已经能够直接使用 Jinja2 成功做到这一点,如下所示:

from jinja2 import Environment, PackageLoader
ENV = Environment(loader=PackageLoader('ticket_app', 'templates'), extensions=['jinja2.ext.do'])
...
TEMP = ENV.get_template('div_' + div_id + '.html')
return TEMP.render(sales_new=sales_new, event_config=event_config)
Run Code Online (Sandbox Code Playgroud)

但是,我宁愿不直接使用 Jinja2...该应用程序仅使用 Flask 和render_template()之前,并且render_template()在幕后使用 Jinja2 (据我所知),似乎应该可以理解render_template()扩展jinja2.ext.do(或与此相关的任何其他扩展)。

到目前为止,我已经尝试过以下操作:

app = Flask(__name__)
app.config['TEMPLATES_AUTO_RELOAD'] = True
app.config['EXPLAIN_TEMPLATE_LOADING'] = True
env = app.jinja_env
env.add_extension('jinja2.ext.do')
Run Code Online (Sandbox Code Playgroud)

虽然上面的代码不会引发错误,但它也不会导致它理解render_template()扩展jinja2.ext.do

有什么建议么?这应该可能吗?如果是这样,怎么办?

Zat*_*gem 5

Flask v.2.0 更新:

从 v.2.0 开始,以下解决方案引发KeyError: 'extensions'异常。试试这个吧。


对于 Flask v.1.1,您可以使用Flask.jinja_options字典直接访问 Flask 加载的 Jinja 扩展 。在你的情况下,只添加这一行应该可以解决问题:

app = Flask(__name__)
app.jinja_options['extensions'].append('jinja2.ext.do')
Run Code Online (Sandbox Code Playgroud)

确保更新 Flask(使用 pip: pip install -U Flask)。