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

  • 本文关键字:集合 变量 flask jinja2
  • 更新时间 :
  • 英文 :


我一直在用flask和SqlAlchemy构建博客引擎,我已经达到了以下目标:

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

我的问题是:

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

使一组变量可用于模板的最简单方法是将它们添加到flask.g中。

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

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

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

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 %} 

最新更新