官方cookbook有介绍在web.py中使用jinja2模板的方法, http://webpy.org/cookbook/template_jinja.zh-cn但是有个缺憾, 只能渲染同级目录下的文件,下面是web.py的jinja2使用的实现.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class render_jinja:
    """Rendering interface to Jinja2 Templates

    Example:

        render= render_jinja('templates')
        render.hello(name='jinja2')
    """
    def __init__(self, *a, **kwargs):
        extensions = kwargs.pop('extensions', [])
        globals = kwargs.pop('globals', {})

        from jinja2 import Environment,FileSystemLoader
        self._lookup = Environment(loader=FileSystemLoader(*a, **kwargs), extensions=extensions)
        self._lookup.globals.update(globals)

    def __getattr__(self, name):
        # Assuming all templates end with .html
        #这里造成了只能使用同级目录的文件,而且时能是html后缀的文件
        path = name + '.html'
        t = self._lookup.get_template(path)
        return t.render

web.py只是提供了jinja2模板使用的简单封装,至于实际使用中还是要自己封装.

下面演示了自己编写的最简单的jinja2的使用方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import web
from jinja2 import Environment, FileSystemLoader

urls = (
    '/index', 'index',
    '/admin', 'admin',
)

app = web.application(urls, globals())
#初始化jinja2的运行环境,使用FileSystemLoader
env = Environment(loader = FileSystemLoader('templates'))

class index(object):
    def GET(self):
        #取得同级目录下的文件
        return env.get_template('index.html').render()

class admin(object):
    def GET(self):
        #取得下层目录的文件
        return env.get_template('admin/admin.html').render()

if __name__ == '__main__':
    app.run()

更详细的使用方法可以去jinja2的官网查http://jinja.pocoo.org/docs/