国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

OnlyMyRailgun / 499人閱讀

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

前兩篇文章主要說明了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="