模板¶
本文只是简单介绍如何在 Flask 中使用 Jinja2 。如果要详细了解这个模板引擎的语法,请查阅Jinja2 模板官方文档 。
在 Flask 中, Jinja2 默认配置如下:
- 当使用 render_template_string() 时,字符串开启自动转义。
- 在模板中可以使用 {% autoescape %} 来手动设置是否转义。
- Flask 在 Jinja2 环境中加入一些全局函数和辅助对象,以增强模板的功能。
标准环境¶
缺省情况下,以下全局变量可以在 Jinja2 模板中使用:
当前配置对象(flask.config
)Changelog
Changed in version 0.10: 这个变量总是可用,甚至是在被导入的模板中。
New in version 0.6.
request
当前请求对象(flask.request
)。在没有活动请求环境情况下渲染模板时,这个变量不可用。
session
当前会话对象( )。在没有活动请求环境情况下渲染模板时,这个变量不可用。
url_for
()
函数。
get_flashed_messages
()flask.get_flashed_messages()
函数。
Jinja 环境行为
这些添加到环境中的变量不是全局变量。与真正的全局变量不同的是这些变量在已导入的模板的环境中是不可见的。这样做是基于性能的原因,同时也考虑让代码更有条理。
那么意义何在?假设你需要导入一个宏,这个宏需要访问请求对象,那么你有两个选择:
- 显式地把请求或都该请求有用的属性作为参数传递给宏。
- 导入“ with context ”宏。
导入方式如下:
在 Flask 中的模板中添加了以下 Jinja2 本身没有的过滤器:
tojson
()
这个函数可以把对象转换为 JSON 格式。如果你要动态生成 JavaScript ,那么这个函数非常有用。
注意,在script
标记内部不能转义,因此在 Flask 0.10 之前的版本中,如果要在 script 标记内部使用这个函数必须用 关闭转义:- <script type=text/javascript>
doSomethingWith({{ user.username|tojson|safe }});
</script>
- <script type=text/javascript>
控制自动转义¶
自动转义是指自动对特殊字符进行转义。特殊字符是指 HTML ( 或 XML 和 XHTML )中的 &
、 >
、 <
、 "
和 '
。因为这些特殊字符代表了特殊的意思,所以如果要在文本中使用它们就必须把它们替换为“实体”。如果不转义,那么用户就无法使用这些字符,而且还会带来安全问题。(参见 跨站脚本攻击(XSS) )
有三种方法可以控制自动转义:
- 在模板中,使用 |safe 过滤器显式把一个字符串标记为安全的 HTML(例如: {{ myvariable|safe }} )。
- 临时关闭整个系统的自动转义。
在模板中关闭自动转义系统可以使用{% autoescape %}
块:
在这样做的时候,要非常小心块中的变量的安全性。
有两种方法可以在 Jinja2 中注册你自己的过滤器。要么手动把它们放入应用的 中,要么使用template_filter()
装饰器。
下面两个例子功能相同,都是倒序一个对象:
- .template_filter('reverse')
def reverse_filter(s):
return s[::-1]def reverse_filter(s):
return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
环境处理器¶
环境处理器的作用是把新的变量自动引入模板环境中。环境处理器在模板被渲染前运行,因此可以把新的变量自动引入模板环境中。它是一个函数,返回值是一个字典。在应用的所有模板中,这个字典将与模板环境合并:
- .context_processor
def inject_user():
return dict(user=g.user)
上例中的环境处理器创建了一个值为 g.user 的 user 变量,并把这个变量加入了模板环境中。这个例子只是用于说明工作原理,不是非常有用,因为在模板中, g总是存在的。
传递值不仅仅局限于变量,还可以传递函数( Python 提供传递函数的功能):
上例中的环境处理器把 format_price 函数传递给了所有模板:
- {{ format_price(0.33) }}