我一直在用烧瓶和 SqlAlchemy 构建一个博客引擎,我已经达到了以下几点:
- 一个通用的基本模板,它有一个左右侧边栏以及基于查询动态生成的页脚区域。
- 在每个视图中传递的许多变量以填充所述侧边栏和页脚。
我的问题是:
有没有一种方法可以将一组变量传递给烧瓶应用程序中的每个视图,而不必在
render_template()
调用中传递它们?
导入侧边栏和其他重复元素的传统方法是导入到您的页面模板继承的布局模板中。例子:
布局.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 %}
使一组变量可用于模板的最简单方法是将它们添加到flask.g
.
例如,您可以拥有g.left_sidebars
,g.right_sidebars
和g.footer
, 每个数组都包含您正在使用的变量。这些变量可能具有预渲染的 HTML(如果可能,可能会缓存以避免每次都渲染它们),或者它们可能是要包含的子模板的名称。
由于flask.g
模板自动可用,您需要做的就是在每个请求期间或在before_request
处理程序中填充这些数组。