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。
有什么建议么?这应该可能吗?如果是这样,怎么办?
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)。
| 归档时间: |
|
| 查看次数: |
4529 次 |
| 最近记录: |