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)    收藏  举报

导航