1

ねじれた Web ドキュメントには、getChild をそのように実装する必要があると書かれています。

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

私が理解している限り、 getChild メソッドへの再帰呼び出しがありますが、 name からパスセグメントを削除するのは誰 (どのクラスのどのメソッドですか?) ですか?

ありがとう !

4

2 に答える 2

2

たとえば、URL / foo / bar/bazは通常次のようになります。

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

ただし、「bar」によって返されるリソースのisLeafがtrueに設定されている場合、getChild呼び出しは実行されません。

于 2012-02-13T11:40:57.670 に答える
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 ドキュメントを見て、Resource のソースを見ると、メソッド「getChildForRequest」 (172 行目) が見つかり、「...モジュール レベルの getChildForRequest. を使用します。これは、モジュール レベルを調べてその関数を見つけることを意味します (58 行目)

そして、モジュール レベルの関数は、"isLeaf" をチェックし、パスの前後の要素を移動することにより、パスの要素をトラバースすることで面白いことを行います。リソースに「isLeaf」がある場合、リソースが返されます。そうでない場合、request.postpath が存在し、「isLeaf」が false の場合、パスが移動され、resource.getChildWithDefaultが呼び出されます。 putChild または単に self.children dict に存在する) を見つけられない場合は、動的リソースを返す必要がある " getChild " を呼び出すか、getChildのデフォルトの戻り値であるNoResource("No such child resource ") 152 行目

チアーズ レイドバック

于 2012-09-17T09:37:32.523 に答える