How to use a Jinja2 extension direct from a Flask render_template
我正在开发一个运行良好的Flask应用程序,直到尝试将以下行添加到要渲染的模板中为止:
1 | {% do totals.update({tier: 0}) %} |
当前呈现模板的代码使用Flask的
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'. |
显而易见的解决方法是将
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和
到目前为止,我已经尝试了以下方法:
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') |
尽管以上内容不会引发错误,但也不会导致其使
有什么建议么? 应该可以吗? 如果是这样,怎么办?
从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:
我实际上发现Zatiranyk概述的选项有时会中断(特别是当我尝试使用Flask-SocketIO时。)
1 | app.jinja_options['extensions'].append('jinja2.ext.do') |
我找到的解决方案是改用以下选项:
1 | app.jinja_env.add_extension('jinja2.ext.do') |