使用基本模板时如何避免重复上下文设置过程?

时间:2014-10-21 12:31:52

标签: python flask jinja2

使用jinja2时,基础"骨架"模板通常由许多其他模板扩展。

我的一个基本模板需要在上下文中使用某些变量,而在我使用此基本模板的任何地方,我都必须复制设置过程。

例如,我可能需要从DB中读取一些类别名称并将其作为列表中的列表呈现,现在我必须在使用基本模板的任何地方编写此查询。

使用jinja2时,有哪些避免重复这类代码的好方法?

3 个答案:

答案 0 :(得分:1)

您可以将上下文处理器添加到您的应用或蓝图中。这些将额外的值注入Jinja语境中。这些不是任何视图的一部分,但会在请求上下文中运行,因此您可以访问视图中通常的所有内容。

@app.context_processor
def base_context():
    return {
        'author': 'davidism',
        'last_update': interesting_function()
        'headers': db.query(MyModel.category).distinct().all()
    }

蓝图上添加的处理器仅适用于从该蓝图上的视图呈现的模板。

传递给render_template函数的上下文将覆盖这些默认上下文值(如果它们具有相同的键)。

答案 1 :(得分:0)

我能想到的一种方法是使用一个装饰器,为每个视图的结果提供额外的上下文变量。

答案 2 :(得分:0)

您可以在Jinja2或自定义过滤器上使用宏:

宏:

http://jinja.pocoo.org/docs/dev/templates/#macros

您可以使用以下装饰器注册自定义过滤器:

https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/filters.py