2012-02-13 64 views
1

扭曲的網頁文檔中說,getChild具有以這種方式來實現:如何做「getChild」工作在扭曲

class Hello(Resource): 
    isLeaf = True 
    def getChild(self, name, request): 
     if name == '': 
      return self 
     return Resource.getChild(self, name, request)$ 

據我瞭解,沒有對getChild方法 遞歸調用,但誰(哪個類的哪個方法?)負責從名稱中刪除路徑 段?

謝謝!

回答

2

例如,URL /富/酒吧/巴茲通常是:

Resource.getChild('foo').getChild('bar').getChild('baz') 

但是,如果通過「酒吧」返回的資源有isLeaf設置爲true,那麼getChild通話將永遠不會被製成在上面。

+0

謝謝,coppettim ...但我不代碼明白是怎麼能這項工作作爲沒有段路是從「名」刪除... – Fred 2012-02-13 11:55:21

2

getChild(self,name,request)的調用者可以使用inspect模塊獲得。

import inspect 
... 
class Hello(Resource): 
    #isLeaf = True # This has to be left out, to ensure, getChild is called! 
    def getChild(self, name, request): 
     print inspect.stack()[2][1] 
     return self 

現在你會看到在標準輸出輸出話說:

2012-09-17 11:16:24+0200 [HTTPChannel,0,127.0.0.1] getChildForRequest 

如果你看看在部分web/resource/Resource API文檔,並期待在資源的來源,你可以找到方法「getChildForRequest」(第172行),並找到一個棄用警告,其中顯示「...使用模塊級別getChildForRequest。」,這意味着查看模塊級別以查找function (line 58)

在這裏我們繼續,通過檢查「isLeaf」並移動prepath和postpath元素來遍歷路徑元素,模塊級函數執行有趣的事情。如果我們的資源有「isLeaf」,則返回資源,否則,如果request.postpath存在且「isLeaf」爲false,則路徑將被移動並調用resource.getChildWithDefault,它本身會查找始終可用的資源(通過putChild或在self.children dict中簡單存在),如果找不到一個,它會調用「getChild」,它應該返回一個動態資源,或者它以getChild的默認返回值結尾,即:NoResource("No such child resource") in Line 152

乾杯 悠閒