我正在开发一个运行良好的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
扩展名。
有什么建议吗?应该可以吗?如果是这样,怎么办?
答案 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')
)。