如何将变量集合传递给模板

时间:2013-07-24 02:21:37

标签: flask jinja2

我一直在用烧瓶和SqlAlchemy建立一个博客引擎,我已经达到了以下几点:

  • 具有左和右的通用基本模板。右侧边栏 基于查询动态生成的页脚区域。
  • 在每个视图中传递的许多变量用于填充所述侧边栏和页脚。

我的问题是:

  

有没有办法可以将一组变量传递给烧瓶应用中的每个视图,而不必在render_template()调用中传递它们?

2 个答案:

答案 0 :(得分:2)

导入侧边栏和其他重复元素的传统方式是导入到您的页面模板继承的布局模板中。例如:

<强>的layout.html:

<!DOCTYPE html>
<html lang="en">
  <head>
  </head>
  <body>
    {% include sidebar.html %}
    {% block body %}
    {% endblock body %}
  </body>
</html>

<强> post.html:

{% extends "layout.html" %}
{% block body %}
  {{ post }}
{% endblock %} 

你也可以创建一个像这样的全局函数:

def createNav():
    nav = '''
        <ul class="nav">
            <li><a href="/">Home</a></li>
            <li><a href="/about">About</a></li>
        </ul>
    '''
    return nav

#make function available inside jinja template
app.jinja_env.globals.update(createNav=createNav)

然后这样打电话:

<强> post.html:

{% extends "layout.html" %}
{% block body %}
  {{ createNav() }}
  {{ post }}
{% endblock %} 

答案 1 :(得分:2)

为模板提供一组变量的最简单方法是将它们添加到flask.g

例如,您可以拥有g.left_sidebarsg.right_sidebarsg.footer,每个数组都包含您正在使用的变量。这些变量可以预先渲染HTML(如果可能的话可以缓存以避免每次都渲染它们),或者它们可以是要包含的子模板的名称。

由于flask.g自动可用于模板,所以您需要做的就是在每个请求期间或before_request处理程序中填充这些数组。