2017-07-10 6 views
0

質問:_cp_dispatch not getting called in cherrypyは、要求に一致するプロパティ/メソッドがない場合に_cp_dispatchが呼び出されるのはです。cherrypyの_cp_dispatchの動作があいまいである

しかし、私のコードで:

import cherrypy 

class A(object): 
    def _cp_dispatch(self, vpath): 
     raise Exception(str(vpath)) 

    @cherrypy.expose 
    def index(self): 
     return "start" 

    @cherrypy.expose 
    def method_1(self): 
     return "method_1" 

cherrypy.quickstart(A()) 

_cp_dispatchは、私はそれはまた、これらのために呼び出される必要があるhttp://127.0.0.1:8080/method_1/garbageまたはhttp://127.0.0.1:8080/index/garbage

ためhttp://127.0.0.1:8080/garbageではなくのために呼ばれています。私はmethod_1インデックスがエンドポイントとして公開されていることがわかりますが、method_1 /ごみのための任意のエンドポイントがありません。だからなぜ_cp_dispatchが呼び出されていないのですか?

答えて

2

_cp_dispatchedは、属性がURLの最初のセグメントと一致しない場合に呼び出されます。パスmethod_1/garbageは次のように解析されます。method_1garbageという名前の属性を持っており、exposed、呼び出し可能である場合method_1

  • という名前の属性の

    1. 見て、それを呼び出します。
    2. それ以外の場合、method_1は1つの位置引数を受け取ると予想されます。存在しない場合は、見つからないという例外を送出します。

    ところで、より良いdefaultの代わり_cp_dispatchという名前のメソッドを定義し、その方法は、セグメントのため、未定義のパスを処理するために、新しいカスタムハンドラを作成するために使用されることを意味しています。例えば:

    @cherrypy.expose 
    def default(self, *args, **kwargs): 
        """Catch all method""" 
        return "Catch all method. {}, {}".format(args, kwargs) 
    

    そして明確にする:method_1/garbagedef method_1(self, arg_1)に等しいです。 cherrypyのデフォルトのディスパッチャはツリーのように振る舞います。 1つの属性(ブランチ)が存在する場合、その属性は残りのパスの解釈を制御します。ルートまたはメソッドのディスパッチャを使用する代わりに、単一のメソッドを定義する代わりに常にクラスを作成できます。

  • +0

    あなたの答えをありがとう、3点を詳しく教えてもらえますか?具体的には、「位置づけの議論を期待する」という意味ですか? method1(ガベージ=何か)のようなものを期待しているのでしょうか? –

    +0

    ええ、引数の名前は "クエリ文字列"を介して渡された場合にのみ関連します。たとえば、 'method1(garbage = None)'として定義された関数がある場合、この関数は '/ method'、'/method1/foo'、 '/ method1?garbage = bar'という3つのurlで呼び出すことができます。最初のケースでは 'garbage == None'、次に' garbage == foo'と 'garbage == bar'があり、' POST'を使うと本体の 'garbage'フィールドを送ることができます。同じ方法で一致させることもできます。すべてがcherrypyの観点、クエリ文字列、URLセグメント、およびURLエンコードされたフォームから「パラメータ」になります。 – cyraxjoe

    関連する問題