Flask上下文处理器在导入的模板中不起作用

时间:2017-07-28 23:23:04

标签: python flask jinja2

这些是我写的代码:

application.py

from flask import Flask, render_template

app = Flask(__name__)

@app.context_processor
def inject_foo():
    return dict(foo='bar')

@app.route('/')
def index():
    return render_template('index.html')

的index.html

{% from 'macros.html' import print_foo %}
<p>print_foo: {{ print_foo() }}</p>
<p>foo(directly): {{ foo }}</p>

macros.html

{% macro print_foo() %}
  foo is {{ foo }}
{% endmacro %}

文件的结构如下:

flask-context-processor-issue/
    application.py
    templates/
        index.html
        macros.html

当我运行应用程序(通过flask run)并转到http://localhost:5000时,我会看到此页:

print_foo: foo is
foo(directly): bar
缺少foo

print_foo。我认为原因是fooprint_foo宏(在导入的模板中)中不可见。

我可以通过修改foo

强制application.py全局可见
...
# @app.context_processor
# def inject_foo():
#     return dict(foo='bar')
app.jinja_env.globals['foo'] = 'bar'
...

但是与app.context_processor一起工作是我认为的一般方式,所以我想知道是否有任何方法可以使示例有效(使用app.context_processor)。

等待你的回答,谢谢。

1 个答案:

答案 0 :(得分:1)

仔细观察文档(http://flask.pocoo.org/docs/0.12/templating/#context-processors)后,我发现这应该有用:

<强>的index.html

{% from 'macros.html' import print_foo with context %}
...

而不是

{% from 'macros.html' import print_foo %}
...
愚蠢的我。