扭曲的网络文档说getChild必须以这种方式实现:
class Hello(Resource):
isLeaf = True
def getChild(self, name, request):
if name == '':
return self
return Resource.getChild(self, name, request)$
据我所知,有一个getChild方法的递归调用 但谁(哪个类的哪个方法?)负责删除路径 来自名称的细分?
谢谢!
答案 0 :(得分:2)
例如,URL / foo / bar / baz通常为:
Resource.getChild('foo').getChild('bar').getChild('baz')
但是,如果'bar'返回的资源将isLeaf设置为true,则永远不会对其进行getChild调用。
答案 1 :(得分:2)
可以使用inspect模块获取getChild的调用者(self,name,request)。
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
现在你将看到stdout中的输出说:
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的默认值,即:{ {3}}
干杯 悠闲