2012-02-13 30 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

干杯 悠闲