python2.7的flask框架之Jinja2简单配置(全局变量&上下文行为&上下文处理器)

我们知道,Flask 使用 Jinja 2 作为模板引擎,我们也可以自由使用其它的模板引擎,但运行 Flask 本身仍然需要 Jinja2 依赖 ,这对启用富扩展是必要的,扩展可以依赖 Jinja2 存在。

我们接下来就来看下Jinja2模板引擎的默认配置:

  • 所有扩展名为 .html 、 .htm 、 .xml 以及 .xhtml 的模板会开启自动转义
  • 模板可以利用 {% autoescape %} 标签选择自动转义的开关。
  • Flask 在 Jinja2 上下文中插入了几个全局函数和助手,另外还有一些目前默认的值

然后,咱们来看下全局变量。

首先是config,它代表的是当前的配置对象 (flask.config)。

然后就是request,它代表的是当前的请求对象 (flask.request),但是当模版不是在活动的请求上下文中渲染时这个变量不可用。

完事就是session,这个代表的是当前的会话对象 (flask.session),但是当模版不是在活动的请求上下文中渲染时这个变量不可用。

再来就是g,代表的是请求相关的全局变量 (flask.g),但是当模版不是在活动的请求上下文中渲染时这个变量不可用。

然后来看url_for(),主要是flask.url_for() 函数。

最后就是get_flashed_messages(),它主要就是flask.get_flashed_messages() 函数。

完事我们来看下Jinja 上下文行为,在这其中的变量,被添加到了请求的上下文中,而非全局变量。和全局变量的区别在于,它们默认不会在导入模板的上下文中出现。这样做,一方面是考虑到性能,另一方面是为了让事情显式透明。

这也就意味着,如果我们想要导入一个需要访问请求对象的宏,其一可以显式地传入请求或请求对象的属性作为宏的参数,其二可以与上下文一起(with context)导入宏,方式如下:

{% from '_helpers.html' import my_macro with context %}

最后来看下Flask 上下文处理器。它可以自动向模板的上下文中插入新变量, 也就是说,它会在模板渲染之前运行,并且可以在模板上下文中插入新值。上下文处理器是一个返回字典的函数,这个字典的键值最终将传入应用中所有模板的上下文,我们来看个简单的代码块儿:

@app.context_processor
def inject_user():
    return dict(user=g.user)

上述代码中的上下文处理器使得模板可以使用一个名为 user ,值为 g.user 的变量。不过这个例子不是很有意思,因为 g 在模板中本来就是可用的,但上述代码解释了上下文处理器是如何工作的。

我们要知道,变量不仅限于值,上下文处理器也可以使某个函数在模板中可用(由于 Python 允许传递函数),来看个例子:

@app.context_processor
def utility_processor():
    def format_price(amount, currency=u'€'):
        return u'{0:.2f}{1}.format(amount, currency)
    return dict(format_price=format_price)

上述代码中的上下文处理器使得 format_price 函数在所有模板中可用,并且展示了上下文处理器传递函数的工作过程,完事我们来看下模板中应该咋接收这个值:

{{ format_price(0.33) }}

 好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。

你可能感兴趣的:(原创)