亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

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

figofuture / 3304人閱讀

摘要:上一篇文章源碼分析模板說(shuō)明了的模板的大致工作原理。本文重點(diǎn)講述模板支持的語(yǔ)法是如何轉(zhuǎn)換生成函數(shù)的。模板的名稱(chēng)統(tǒng)一是。模板代碼斷行模板內(nèi)容函數(shù)內(nèi)容從結(jié)果來(lái)看,模板中的斷行只是為了不再結(jié)果中插入一個(gè)多余的換行符而已。

上一篇文章web.py源碼分析: 模板(1)說(shuō)明了web.py的模板的大致工作原理。本文重點(diǎn)講述web.py模板支持的語(yǔ)法是如何轉(zhuǎn)換生成__template__函數(shù)的。

web.py模板語(yǔ)法和__template__()函數(shù)的對(duì)應(yīng)關(guān)系

本章會(huì)列出模板內(nèi)容以及轉(zhuǎn)換之后的__template__()函數(shù)的內(nèi)容,以及必要的文字說(shuō)明。模板的名稱(chēng)統(tǒng)一是hello.html。

純字符串

模板內(nèi)容

hello, world

函數(shù)內(nèi)容

def __template__():
    __lineoffset__ = -5
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([u"hello, world
"])

    return self
def with

模板內(nèi)容

$def with (name, value=[], *args, **kargs)
hello, $name

函數(shù)內(nèi)容

def __template__ (name, value=[], *args, **kargs):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([u"hello, ", escape_(name, True), u"
"])

    return self
    

從生成的函數(shù)可以看出,def with語(yǔ)法所生成的就是__template__()函數(shù)的參數(shù)列表。

表達(dá)式替換

模板內(nèi)容

$def with (name, value)
$name
${name + value}
$(name + value)ing.
$name[value].function()

函數(shù)內(nèi)容

def __template__ (name, value):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([escape_(name, True), u"
"])
    extend_([escape_((name + value), True), u"
"])
    extend_([escape_((name + value), True), u"ing.
"])
    extend_([escape_(name[value].function(), True), u"
"])

    return self

表達(dá)式的替換就是執(zhí)行表達(dá)式(表達(dá)式對(duì)應(yīng)的代碼),得到的結(jié)果添加到TemplateResult實(shí)例中。

賦值

模板內(nèi)容

$def with (name, func)
$ name1 = name
$ name2 = func()

函數(shù)內(nèi)容

def __template__ (name, func):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    name1 = name
    name2 = func()

    return self

其實(shí),轉(zhuǎn)換后就是Python代碼里的賦值語(yǔ)句。

內(nèi)容過(guò)濾

模板內(nèi)容

$def with (name)
$name
$:name

函數(shù)內(nèi)容

def __template__ (name):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([escape_(name, True), u"
"])
    extend_([escape_(name, False), u"
"])

    return self

從生成的代碼來(lái)看,是否使用過(guò)濾語(yǔ)法的區(qū)別就是傳入excape_函數(shù)的第二個(gè)參數(shù),這個(gè)函數(shù)其實(shí)只是一個(gè)字符串處理函數(shù),后續(xù)再說(shuō)。

模板代碼斷行(newline suppression)

模板內(nèi)容

$def with (name, func)
$name
hello, 
$name 
!
$func(1, 2, 3, 4, 5)

函數(shù)內(nèi)容

def __template__ (name, func):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([escape_(name, True), u"
"])
    extend_([u"hello, "])
    extend_([escape_(name, True), u" "])
    extend_([u"!
"])
    extend_([escape_(func(1, 2, 3, 4, 5), True), u"
"])

    return self

從結(jié)果來(lái)看,模板中的斷行只是為了不再結(jié)果中插入一個(gè)多余的換行符而已。另外,一個(gè)表達(dá)式的中間是不支持?jǐn)嘈械?,就比如在模板中不能把func函數(shù)的參數(shù)列表寫(xiě)成兩行。

$符號(hào)

模板內(nèi)容

$$

函數(shù)內(nèi)容

def __template__():
    __lineoffset__ = -5
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([u"$", u"
"])

    return self
    
注釋

模板內(nèi)容

$# comment line
hello, world.

函數(shù)內(nèi)容

def __template__():
    __lineoffset__ = -5
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([u"
"])
    extend_([u"hello, world.
"])

    return self

模板中注釋的行在生成的函數(shù)中只有一個(gè)換行符。

控制結(jié)構(gòu) for循環(huán)

模板內(nèi)容

$for i in range(10):
    I like $i

函數(shù)內(nèi)容

def __template__():
    __lineoffset__ = -5
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    for i in loop.setup(range(10)):
        extend_([u"I like ", escape_(i, True), u"
"])

return self

模板中的for循環(huán)被轉(zhuǎn)換成了代碼中的for循環(huán),而且用上了變量loop(ForLoop對(duì)象后續(xù)再來(lái)看)。

while循環(huán)

模板內(nèi)容

$def with (name_list)

$while name_list:
    hello, $name_list.pop()

函數(shù)內(nèi)容

def __template__ (name_list):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([u"
"])
    while name_list:
        extend_([u"hello, ", escape_(name_list.pop(), True), u"
"])

    return self
    

注意和for循環(huán)的區(qū)別,沒(méi)有使用loop變量。

for循環(huán)的loop變量

模板內(nèi)容

$def with (name_list)
$for name in name_list:
    $loop.index
    $loop.index0
    $loop.first
    $loop.last
    $loop.odd
    $loop.even
    $loop.parity
    $loop.parent
    hello, $name

$for i in range(10):
    $for name in name_list:
        $loop.parent
        hello, $name

函數(shù)內(nèi)容

def __template__ (name_list):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    for name in loop.setup(name_list):
        extend_([escape_(loop.index, True), u"
"])
        extend_([escape_(loop.index0, True), u"
"])
        extend_([escape_(loop.first, True), u"
"])
        extend_([escape_(loop.last, True), u"
"])
        extend_([escape_(loop.odd, True), u"
"])
        extend_([escape_(loop.even, True), u"
"])
        extend_([escape_(loop.parity, True), u"
"])
        extend_([escape_(loop.parent, True), u"
"])
        extend_([u"hello, ", escape_(name, True), u"
"])
        extend_([u"
"])
    for i in loop.setup(range(10)):
        for name in loop.setup(name_list):
            extend_([escape_(loop.parent, True), u"
"])
            extend_([u"hello, ", escape_(name, True), u"
"])

    return self

這里展示了loop變量的成員,以及嵌套循環(huán)的使用。

if-else

模板內(nèi)容

$def with (name_list)
$if name_list:
    $len(name_list)
$else:
    0

函數(shù)內(nèi)容

def __template__ (name_list):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    if name_list:
        extend_([escape_(len(name_list), True), u"
"])
    else:
        extend_([u"0
"])

    return self

elif語(yǔ)句也支持。

函數(shù)定義

模板內(nèi)容

$def with (name_list)

$def hello(name):
    hello, $name

$def hello_to_all(nlist):
    $for each in nlist:
        $hello(each)

$hello_to_all(name_list)

函數(shù)內(nèi)容

def __template__ (name_list):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([u"
"])
    __lineoffset__ -= 3
    def hello(name):
        self = TemplateResult(); extend_ = self.extend
        extend_([u"hello, ", escape_(name, True), u"
"])
        extend_([u"
"])
        return self
    __lineoffset__ -= 3
    def hello_to_all(nlist):
        self = TemplateResult(); extend_ = self.extend
        for each in loop.setup(nlist):
            extend_([escape_(hello(each), True), u"
"])
            extend_([u"
"])
        return self
    extend_([escape_(hello_to_all(name_list), True), u"
"])

    return self

模板對(duì)函數(shù)的支持其實(shí)就是定義內(nèi)部函數(shù)并且調(diào)用,每個(gè)內(nèi)部函數(shù)的返回結(jié)果也都是TemplateResult實(shí)例。

code

模板內(nèi)容

$def with (name_list)

$code:
  new_list = [x.upper() for x in name_list]
  def hello(name):
      return "hello, %s" % (name)

  more_new_list = []
  for each in new_list:
      more_new_list.append(hello(each))

$hello("everybody")
$len(more_new_list)

函數(shù)內(nèi)容

def __template__ (name_list):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    extend_([u"
"])

    new_list = [x.upper() for x in name_list]
    def hello(name):
        return "hello, %s" % (name)

    more_new_list = []
    for each in new_list:
        more_new_list.append(hello(each))

    extend_([escape_(hello("everybody"), True), u"
"])
    extend_([escape_(len(more_new_list), True), u"
"])

    return self

code的語(yǔ)法有點(diǎn)復(fù)雜,其內(nèi)部是用來(lái)定義原始的Python代碼的,有如下幾個(gè)特點(diǎn):

code內(nèi)部定義的函數(shù)也是內(nèi)部函數(shù),在模板的其他地方可以調(diào)用,但是不會(huì)把結(jié)果存放在TemplateResult實(shí)例中返回。

code中定義的變量都會(huì)作為_(kāi)_template__()函數(shù)的局部變量,在模板的其他地方可以調(diào)用。

注意,code塊中不要使用print語(yǔ)句打印輸出(雖然默認(rèn)已經(jīng)禁止了)。

var

模板內(nèi)容

$def with (name_list)
$var title: hi
$var title2: "hi"
$var name: $name_list[0]
$var name2: name_list[0]

函數(shù)內(nèi)容

def __template__ (name_list):
    __lineoffset__ = -4
    loop = ForLoop()
    self = TemplateResult(); extend_ = self.extend
    self["title"] = join_(u"hi")
    self["title2"] = join_(u""hi"")
    self["name"] = join_(escape_(name_list[0], True))
    self["name2"] = join_(u"name_list[0]")

    return self

var是用來(lái)為模板設(shè)置屬性的,從生成的代碼來(lái)看,就是為T(mén)emplateResult實(shí)例設(shè)置屬性。上面的模板內(nèi)容里有一些關(guān)鍵細(xì)節(jié):

var name: value中的冒號(hào)后面的內(nèi)容默認(rèn)是作為字符串處理的,可以不用加引號(hào),如果加了引號(hào),則引號(hào)也會(huì)作為內(nèi)容的一部分。

如果要在冒號(hào)后面訪問(wèn)一些變量值,需要使用$前綴。

總結(jié)

寫(xiě)了這些web.py模板支持的語(yǔ)法和生成的代碼的對(duì)應(yīng)關(guān)系,希望有助于大家理解模板的語(yǔ)法,了解每種語(yǔ)法的用途,避免踩坑。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/45358.html

相關(guān)文章

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

    摘要:模板函數(shù)到底長(zhǎng)什么樣下面我們就可以來(lái)看看模板函數(shù)到底長(zhǎng)什么樣了。當(dāng)然,首先得創(chuàng)建一個(gè)模板文件??偨Y(jié)通過(guò)打印中間結(jié)果和分析代碼,我們已經(jīng)大概知道了的模板是如何轉(zhuǎn)化成內(nèi)容的。下一篇文章會(huì)闡述模板的各種語(yǔ)法所對(duì)應(yīng)的動(dòng)態(tài)函數(shù)內(nèi)容。 web.py模板的實(shí)現(xiàn)原理 web.py的模板實(shí)現(xiàn)利用了Python的可執(zhí)行對(duì)象的動(dòng)態(tài)特性:根據(jù)模板內(nèi)容和渲染函數(shù)的參數(shù)創(chuàng)建一個(gè)函數(shù),該函數(shù)執(zhí)行的時(shí)候會(huì)返回一個(gè)Te...

    Rocko 評(píng)論0 收藏0
  • web.py源碼分析: 模板(3)

    摘要:前兩篇文章主要說(shuō)明了的模板系統(tǒng)將模板文件處理后得到的結(jié)果函數(shù)。生成函數(shù)的代碼這個(gè)是模板生成過(guò)程中最長(zhǎng)最復(fù)雜的一段,會(huì)應(yīng)用到的分析功能以及動(dòng)態(tài)編譯功能。參數(shù)都是一個(gè),表示還未解析的模板內(nèi)容。 前兩篇文章主要說(shuō)明了web.py的模板系統(tǒng)將模板文件處理后得到的結(jié)果:__template__()函數(shù)。本文主要講述模板文件是如何變成__template__()函數(shù)的。 Render和frende...

    OnlyMyRailgun 評(píng)論0 收藏0
  • web.py源碼分析: application(1)

    摘要:本文主要分析的是庫(kù)的這個(gè)模塊中的代碼。將結(jié)果轉(zhuǎn)換成一個(gè)迭代器。函數(shù)函數(shù)的定義如下位置位置位置該函數(shù)的參數(shù)中就是,是路由映射表則是,是本次請(qǐng)求路徑。位置,如果是其他情況,比如直接指定一個(gè)類(lèi)對(duì)象作為處理對(duì)象。 本文主要分析的是web.py庫(kù)的application.py這個(gè)模塊中的代碼??偟膩?lái)說(shuō),這個(gè)模塊主要實(shí)現(xiàn)了WSGI兼容的接口,以便應(yīng)用程序能夠被WSGI應(yīng)用服務(wù)器調(diào)用。WSGI是We...

    edgardeng 評(píng)論0 收藏0
  • 基于Linux環(huán)境的Web.py框架介紹

    摘要:前言在文章基于環(huán)境搭建框架方法介紹中介紹了客戶端和服務(wù)器的交互過(guò)程,服務(wù)器接收客戶端的請(qǐng)求后,由應(yīng)用服務(wù)器對(duì)瀏覽器的請(qǐng)求進(jìn)行處理,將生成的響應(yīng)傳遞給服務(wù)器,再由服務(wù)器返回給客戶端。 前言 在文章《基于Linux環(huán)境搭建Nginx+uWSGI+Python框架方法介紹》中介紹了客戶端和Web服務(wù)器的交互過(guò)程,Web服務(wù)器接收客戶端的請(qǐng)求后,由Web應(yīng)用服務(wù)器對(duì)瀏覽器的請(qǐng)求進(jìn)行處理,將生成...

    caikeal 評(píng)論0 收藏0
  • newrelic python agent 源碼分析-1

    摘要:是應(yīng)用性能管理監(jiān)控解決方案提供商。目錄是列出的命令腳本所在目錄。包含文件如下的函數(shù)是命令執(zhí)行的入口。而對(duì)于硬件信息的檢測(cè)則由進(jìn)行。文檔地址源碼仔細(xì)看下去,太復(fù)雜了。下一篇再分析一個(gè)請(qǐng)求到結(jié)束探針工作的完整過(guò)程吧。 Newrelic 是APM(Application Performance Management)(應(yīng)用性能管理/監(jiān)控)解決方案提供商。項(xiàng)目中,通常用它來(lái)追蹤應(yīng)用的性能。最近...

    szysky 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<