【问题标题】:How to use a Jinja2 extension direct from a Flask render_template如何直接从 Flask render_template 使用 Jinja2 扩展
【发布时间】:2019-03-12 00:14:36
【问题描述】:

我正在开发一个运行良好的 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'.

显而易见的解决方法是将 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)

但是,我宁愿不直接使用 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 扩展。

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

【问题讨论】:

    标签: python flask jinja2


    【解决方案1】:

    Flask v.2.0 更新:

    从 v.2.0 开始,以下解决方案引发了 KeyError: 'extensions' 异常。请改用this


    对于 Flask v.1.1,您可以使用 Flask.jinja_options 字典直接访问 Flask 加载的 Jinja 扩展。在您的情况下,仅添加这一行应该可以解决问题:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        相关资源
        最近更新 更多