1.上下文

模板上下文包含了很多变量,其中包括我们调用render_template()函数时手动传入的变量以及Flask默认传入的变量。

除了渲染时传入变量,还可以在模板中定义变量,使用set标签:

{% set navigation = [('/', 'Home'), ('/about', 'About')] %}

也可以将一部分模板数据定义为变量,使用set和endset标签声明开始和结束:

{% set navigation %}
    <li><a href="/">Home</a>
    <li><a href="/about">About</a>
{% endset %}

内置上下文变量

Flask在模板上下文中提供了一些内置变量,可以在模板中直接使用

config 当前的配置对象

request 当前的请求对象,在已激活的请求环境下可用

session 当前的会话对象,在已激活的请求环境下可用

g 与请求绑定的全局变量在已激活的请求环境下可用

自定义上下文

如果多个模板都需要使用同一变量,那么比起在多个视图函数中重 复传入,更好的方法是能够设置一个模板全局变量。Flask提供了一个 app.context_processor装饰器,可以用来注册模板上下文处理函数,它可 以帮我们完成统一传入变量的工作。模板上下文处理函数需要返回一个 包含变量键值对的字典

@app.context_processor def inject_foo():
foo = 'I am foo.'
return dict(foo=foo) # 等同于return {'foo': foo}

当我们调用render_template()函数渲染任意一个模板时,所有使 用app.context_processor装饰器注册的模板上下文处理函数(包括Flask内 置的上下文处理函数)都会被执行,这些函数的返回值会被添加到模板 中,因此我们可以在模板中直接使用foo变量。

除了使用app.context_processor装饰器,也可以直接将其作为方法调 用,传入模板上下文处理函数:

def inject_foo():
foo = 'I am foo.' return dict(foo=foo)
app.context_processor(inject_foo)

使用lambda可以简化为:

app.context_processor(lambda: dict(foo='I am foo.'))

全局对象

全局对象是指在所有的模板中都可以直接使用的对象,包括在模板中导入的模板

1.内置全局函数

Jinja2在模板中默认提供了一些全局函数,常用的三个函数

range([start,]stop[,step])  和Python中的range()用法相同

lipsum(n\=5, html\=True, min\=20, max\=100) 生成随机文本

dict(**items) 和Python的dict()用法相同

除了Jinja2内置的全局函数,Flask也在模板中内置了两个全局函 数

url_for() 用于生成URL的函数

gen_flashed_message() 用于获取flash消息的函数

2.自定义全局函数

除了使用app.context_processor注册模板上下文处理函数来传入函 数,我们也可以使用app.template_global装饰器直接将函数注册为模板全 局函数

@app.template_global() def bar():
return 'I am bar.'

默认使用函数的原名称传入模板,在app.template_global()装饰器 中使用name参数可以指定一个自定义名称。app.template_global()仅 能用于注册全局函数

你可以直接使用app.add_template_global()方法注册自定义全局函 数,传入函数对象和可选的自定义名称(name),比如 app.add_template_global(your_global_function)


0 Comments latest

No comments.