关于python:如何直接从Flask render_template使用Jinja2扩展

How to use a Jinja2 extension direct from a Flask render_template

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

1
{% do totals.update({tier: 0}) %}

当前呈现模板的代码使用Flask的render_template()

1
2
3
4
5
6
from flask import Flask, Response, request, session
from flask import render_template
app = Flask(__name__)

..
return render_template(<template.htlm>,...)

失败并显示以下错误:

1
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'.

显而易见的解决方法是将jinja2.ext.do扩展名添加到jinja中。 我已经能够直接使用Jinja2成功做到这一点,具体如下:

1
2
3
4
5
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)

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

到目前为止,我已经尝试了以下方法:

1
2
3
4
5
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')

尽管以上内容不会引发错误,但也不会导致其使render_template()理解jinja2.ext.do扩展名。

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


从Flask v.1.1.0开始,您可以使用Flask.jinja_options字典直接访问Flask加载的Jinja扩展名。 就您而言,仅添加以下行即可解决问题:

1
2
app = Flask(__name__)
app.jinja_options['extensions'].append('jinja2.ext.do')

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


我实际上发现Zatiranyk概述的选项有时会中断(特别是当我尝试使用Flask-SocketIO时。)

1
app.jinja_options['extensions'].append('jinja2.ext.do')

我找到的解决方案是改用以下选项:

1
app.jinja_env.add_extension('jinja2.ext.do')