2012-02-13 3 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/fooの/バー/ bazには、通常、次のようになります。「バー」で返されたリソースがのisLeafがtrueに設定されている場合は、その後でGetChild呼び出しが行われることはありません

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

その上に。

+0

おかげで、coppettim ...しかし、私はコードでは理解していないことはありませんセグメントのパスとして、この作品は、「名前」から削除されることができる方法です... – Fred

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 

今、あなたはSTDOUTで出力が言って表示されます。

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

あなたはセクションweb/resource/ResourceでAPIドキュメントを見て、リソースのソースを見れば、あなたは見つけることができますメソッド "getChildForRequest"(172行目)を検索し、 "... module level 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で終了します。

乾杯 のんびり