web.py源码分析: 模板(3)
admin
2023-07-31 01:51:46
0

前两篇文章主要说明了web.py的模板系统将模板文件处理后得到的结果:__template__()函数。本文主要讲述模板文件是如何变成__template__()函数的。

Render和frender

一般来说,更常用的是Render类,该类会处理整个目录下的模板,还支持缓存和嵌套模板。不过这些其实都和模板本身的解析基本没关系,以后再说明这个类的实现和用途。这里我们使用frender()函数:

def frender(path, **keywords):
    \"\"\"Creates a template from the given file path.
    \"\"\"
    return Template(open(path).read(), filename=path, **keywords)

这个函数相当简单,只作了一键事情,就是读取模板文件内容,然后交给Template类处理,并且返回一个Template类实例。从这里也可以看出,整个模板的解析,只和Template类有关,frender是来打杂的。

Template类

Template实例的效果

当我们根据一个模板内容创建一个Template类实例t后,我们可以调用该实例,这相当于调用模板对应的__template__()函数,得到的结果是一个TemplateResult实例。

In [7]: t = web.template.frender(\"templates/hello.html\")
# coding: utf-8
def __template__ (name):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([u\'hello, \', escape_(name, True), u\'\\n\'])

    return self

In [8]: print t(\"xxxx\")
hello, xxxx


In [9]: print type(t(\"xxxx\"))


Template实例化过程

Template实例化过程是把模板转换成HTML内容的实质性步骤,不过这个过程比较复杂。但是,概括的来讲,这个过程和Template的__init__()函数中的步骤差不都差不多。

# Template类的__init__()函数
def __init__(self, text, filename=\'