<python模块>Jinja2

时间:March 16, 2018 分类:

目录:

介绍

jinja2是一种进行渲染的模板语言,和django等模板语言类似,jinja2在salt中被使用。

文档参考jinja2

示例api

最基本的方式就是通过 Template 创建一个模板并渲染它。

Python 2.7.14 (default, Oct 26 2017, 18:42:25) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from jinja2 import Template
>>> template = Template('Hello {{ name }}!')
>>> template.render(name='John Doe')
u'Hello John Doe!'

这是最简单的通过模板从字符串加载,如果是文件系统或别的数据源需要其他的配置方式。

通过创建一个Template的实例,你会得到一个新的模板对象,提供一个名为render()的方法,该方法在有字典或关键字参数时调用扩充模板。字典或关键字参数会被传递到模板,即模板“上下文”。

Jinja2 内部使用 unicode 并且返回值也是 unicode 字符串。所以确 保你的应用里也确实使用 unicode。

API基础

Jinja2 使用一个名为Environment的中心对象。这个类的实例用于存储配 置、全局对象,并用于从文件系统或其它位置加载模板。即使你通过:class:Template 类的构造函数用字符串创建模板,也会为你自动创建一个环境,尽管是共享的。

大多数应用在应用初始化时创建一个Environment对象,并用它加载模板。 在某些情况下,如果使用多份配置,使用并列的多个环境无论如何是有用的。

配置 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() 方法:

template.render(the='variables', go='here')

使用一个模板加载器,而不是向 Template 或 Environment.from_string() 传递字符串,有许多好处。除了使用上便利, 也使得模板继承成为可能。

Python 2.7.14 (default, Oct 27 2017, 10:09:21) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> yamlconfig_data = open('db.yaml')
>>> yaml_data = yaml.load(yamlconfig_data)
>>> yamlconfig_data.close()
>>> print yaml_data

示例db.yaml

shop:
  db_m3300: &db_m3300
    host: 'm3300.mysql.whysdomain.com'
    username: 'wanghongyu'
    password: '123456'
    port: '3300'
  db_m3301: &db_m3301
    host: 'm3301.mysql.whysdomain.com'
    username: 'wanghongyu'
    password: '123456'
    port: '3301'
development:
  database: &dbconf
    db_dev_00: *db_m3300
    db_dev_01: *db_m3301
production:
  database: *dbconf

获取数据的时候就可以通过yaml_data['production']['database']['db_dev_00']['host']获取数据

template.render(yaml_data=yaml_data)

模板替换可以参考{{ yaml_data.production.database.db_dev_00.host }}

/tmp/a

test {{ yaml_data.production.database.db_dev_00.host }}

/tmp/b内容为示例db.yaml

[root@why 18:50:02 ~]#python
Python 2.7.5 (default, Aug  4 2017, 00:39:18) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> yamlconfig_data = open('/tmp/b')
>>> yaml_data = yaml.load(yamlconfig_data)
>>> from jinja2 import Environment, FileSystemLoader
>>> env = Environment(autoescape=False, loader=FileSystemLoader('/tmp/'), trim_blocks=False)
>>> template = env.get_template('a')
>>> template.render(yaml_data=yaml_data)
u'test m3300.mysql.whysdomain.com'

然后可以将渲染的文件重新写入。

如果遇到问题

yaml.parser.ParserError: while parsing a block mapping
  in "/tmp/b", line 1, column 1
expected <block end>, but found '<block mapping start>'
  in "/tmp/b", line 7, column 2

可能是复制过来格式有问题。