欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-16 23:43:16
...

我们知道,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) }}

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

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