成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

OnlyMyRailgun / 528人閱讀

摘要:前兩篇文章主要說明了的模板系統(tǒng)將模板文件處理后得到的結(jié)果函數(shù)。生成函數(shù)的代碼這個是模板生成過程中最長最復(fù)雜的一段,會應(yīng)用到的分析功能以及動態(tài)編譯功能。參數(shù)都是一個,表示還未解析的模板內(nèi)容。

前兩篇文章主要說明了web.py的模板系統(tǒng)將模板文件處理后得到的結(jié)果:__template__()函數(shù)。本文主要講述模板文件是如何變成__template__()函數(shù)的。

Render和frender

一般來說,更常用的是Render類,該類會處理整個目錄下的模板,還支持緩存和嵌套模板。不過這些其實都和模板本身的解析基本沒關(guān)系,以后再說明這個類的實現(xiàn)和用途。這里我們使用frender()函數(shù):

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

這個函數(shù)相當(dāng)簡單,只作了一鍵事情,就是讀取模板文件內(nèi)容,然后交給Template類處理,并且返回一個Template類實例。從這里也可以看出,整個模板的解析,只和Template類有關(guān),frender是來打雜的。

Template類 Template實例的效果

當(dāng)我們根據(jù)一個模板內(nèi)容創(chuàng)建一個Template類實例t后,我們可以調(diào)用該實例,這相當(dāng)于調(diào)用模板對應(yīng)的__template__()函數(shù),得到的結(jié)果是一個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實例化過程是把模板轉(zhuǎn)換成HTML內(nèi)容的實質(zhì)性步驟,不過這個過程比較復(fù)雜。但是,概括的來講,這個過程和Template的__init__()函數(shù)中的步驟差不都差不多。

# Template類的__init__()函數(shù)
def __init__(self, text, filename="