资讯专栏INFORMATION COLUMN

web.py源码分析: 模板(3)

OnlyMyRailgun / 482人阅读

摘要:前两篇文章主要说明了的模板系统将模板文件处理后得到的结果函数。生成函数的代码这个是模板生成过程中最长最复杂的一段,会应用到的分析功能以及动态编译功能。参数都是一个,表示还未解析的模板内容。

前两篇文章主要说明了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"
"])

    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="