webpy template

介绍

模板是为了将逻辑数据与界面模板文件进行分离。

过程

还是todo的例子。

1
2
3
4
5
6
7
8
render = web.template.render(‘templates’, base=‘base’)

class Index:


def GET(self):

return render.index(todos, form)

render = web.template.render('templates', base='base')创建了一个Render实例

render.index(todos, form)对应

1
2
3
4
5
6
7
8
9
10
11
12
13
class Render:


def getattr(self, name):
t = self._template(name)
if self._base and isinstance(t, Template):

def template(a, **kw):
return self._base(t(a, **kw))

return template
else:
return self._template(name)
  • 如果没有base,返回一个名为index的Template(),所以是Template()__call__(todos, form)
  • 有base的情况下,是Template()__call__(Template()__call__(todos, form)),外面的是base的,里面的是index。上述表达是错误的,这样好理解。

下面具体介绍:

  1. 在没有base的情况下,Template的初始化的地方是Template(open(path).read(), filename=path, **self._keywords)

    *   generate_code
    

    找到 def with,read_suite,将def with替换成

    1
    2
    3
    4
    5
    6
    def template (todos, form):
    lineoffset = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend

    return self

    在头部加上# coding: utf-8\n,解析中间的python code

    • compile
      编译成Code对象,Template()__call__(todos, form)的时候将todo、form作为该方法__template__的参数,返回一个TemplateResult2. 有base的情况下,将index返回的self(即一个TemplateResult的实例)作为新的__template__的参数,返回一个TemplateResult

最后,TemplateResult作为一个可迭代的对象,传递给client

参考

http://webpy.org/src/todo-list/0.3