Flask利用Jinja2的模板引擎,,为了丰富的扩展可用,所有的扩展是依赖于Jinja2的存在
jinja2配置
除非定制,Flask中Jinja2配置如下:
所有以.html,.htm,.xml,.xhtml结尾的模板开启自动转义.
一个模板可以用{%autosecape%}标签选择开关自动转义
Flask在Jinja2上下文中插入了几个全局函数和助手,还有一些目前默认的值
标准上下文
下面的全局变量默认在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 %}
标准过滤器:
这些过滤器在jinja2中是可用的,也是Jinja2自带的过滤器
toJson():这个函数把给定的对象转换成JSON表示,如果要动态生成JavaScript
注意在script标签里面转义是不应该发生的,因此需要用|safe禁止转义
控制自动转义:
自动转义的概念是自动为你转义特殊字符.HTML意义下的特殊字符是&,>,<,"以及',因为这些字符在文档中表示他们特定的含义,需要在模板中禁用自动转义,这种情况可能是想要在页面显示的插入HTML,有三种方式:
在Python代码中,在传递到模板之前,用Markup对象封装HTML字符串,在模板中使用safe过滤器显示标记一个字符串安全
暂时的禁止自动转义系统,可以使用{%autoescape%}块在模板中禁用转义系统:
{%autoescape false%}
<p>autoescapeing is disabled
<p>{{will_not_be_escapes}}
{%endautoescape%}
注册过滤器:
在Jinja2中注册你自己的过滤器,两种方式,手动加入到jinja_env或者使用template_filter()装饰器
@app.template_filter('reverse')
def reverse_filter(s):
return s[::-1]
def reverse_filter(s):
return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
在使用装饰器的情况下,
{%for x in mylist | reverse%}
{%endfor%}
上下文处理器
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 = formatprice)
上面的上下文处理器使得format_price函数在所有模板中可用:
{{format_price(0.33)}}