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

时间:2018-10-06 21:12:25

标签: python flask jinja2

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

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

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

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

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

此操作失败,并显示以下错误:

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

最明显的解决方法是向Jinja添加jinja2.ext.do扩展名。我已经能够直接使用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)

但是,我宁愿不直接使用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')

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

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

2 个答案:

答案 0 :(得分:1)

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

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

我发现的解决方案是改用以下选项:

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

答案 1 :(得分:0)

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

queuestate.Processing

确保您更新了Flask(使用点子:app = Flask(__name__) app.jinja_options['extensions'].append('jinja2.ext.do') )。