jinja2API一:Environment和unicode
一.Environment环境变量
Jinja2 使用一个名为 Environment 的中心对象。
这个类的实例用于存储配 置、全局对象,并用于从文件系统或其它位置加载模板。
通过:class:Template 类的构造函数用字符串创建模板,也会为你自动创建一个环境,尽管是共享的。
大多数应用在应用初始化时创建一个 Environment 对象---->然后用它加载模板env.get_template()-->渲染变量template.render(变量............),具体如下:
在某些情况下,如果使用多份配置,使用并列的多个环境无论如何是有用的。
配置 Jinja2 为你的应用加载文档的最简单方式看起来大概是这样:
from jinja2 import Environment, PackageLoader env = Environment(loader=PackageLoader('yourapplication', 'templates'))
这会创建一个默认设定下的模板环境和一个在 yourapplication python 包中的 templates文件夹中寻找模板的加载器。
多个加载器是可用的,如果你需要从数据库或其它资源加载模板,你也可以自己写一个。
你只需要调用 get_template() 方法从这个环境中加载模板,并会返回已加载的 Template:
template = env.get_template('mytemplate.html')
用若干变量来渲染它,调用 render() 方法:
print template.render(the='variables', go='here')
使用一个模板加载器,而不是向 Template 或 Environment.from_string() 传递字符串,有许多好处。
除了使用上便利, 也使得模板继承成为可能。
二、unicode编码
Jinja2 内部使用 Unicode
Python 2.x 支持两种表示字符串对象的方法。一种是 str 类型,另一种是 unicode 类型,它们都继承于 basestring 类型。不幸的是,默认的 str 不 应该用于存储基于文本的信息,除非只用到 ASCII 字符。在 Python 2.6 中,可以 在模块层指定 unicode 为默认值,而在 Python 3 中会是默认值。
要显式使用一个 Unicode 字符串,你需要给字符串字面量加上 u 前缀: u'Hänsel undGretel sagen Hallo' 。这样 Python 会用当前模块的字符编码来 解码字符串,来把字符串存储为 Unicode 。如果没有指定编码,默认是 ASCII , 这意味着你不能使用任何非 ASCII 的标识符。
在使用 Unicode 字面量的 Python 模块的首行或第二行添加下面的注释,来妥善设 置模块编码:
# -*- coding: utf-8 -*-
我们推荐为 Python 模块和模板使用 utf-8 编码,因为在 utf-8 中,可以表示 Unicode 中的每个字符,并且向后兼容 ASCII 。对于 Jinja2 ,模板的默认编码 假定为 utf-8 。
用 Jinja2 来处理非 Unicode 数据是不可能的。这是因为 Jinja2 已经在语言层 使用了 Unicode 。例如 Jinja2 在表达式中把不间断空格视为有效的空格,这需要 获悉编码或操作一个 Unicode 字符串。.
Jinja2 对只有 ASCII 的字符串返回 str,而对其它返回 unicode:
>>> m = Template(u"{% set a, b = 'foo', 'föö' %}").module
>>> m.a
'foo'
>>> m.b
u'f\xf6\xf6'
posted on 2015-07-28 15:42 myworldworld 阅读(559) 评论(0) 收藏 举报
浙公网安备 33010602011771号