_cp_dispatch在cherrypy中的模糊行为

时间:2017-07-10 20:18:52

标签: web-services rest cherrypy endpoint

问题:_cp_dispatch not getting called in 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())
http://127.0.0.1:8080/garbage调用

_cp_dispatch,但http://127.0.0.1:8080/method_1/garbagehttp://127.0.0.1:8080/index/garbage不调用

我也需要它来调用它们。我可以看到 method_1 index 作为端点公开,但没有任何端点 method_1 /垃圾 即可。那么为什么不调用_cp_dispatch呢?

1 个答案:

答案 0 :(得分:3)

当没有属性与网址的第一个网段匹配时,会调用

_cp_dispatched。路径method_1/garbage被解析为:

  1. 查找名为method_1
  2. 的属性
  3. 如果method_1有一个名为garbage且属exposed并且可以调用的属性,请将其调用。
  4. 否则method_1预计会收到一个位置参数,如果没有,则引发一个说明未找到的异常。
  5. BTW更好地定义名为default而不是_cp_dispatch的方法,该方法旨在用于创建新的自定义处理程序以处理该段的未定义路径。 e.g:

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

    澄清:method_1/garbage等于def method_1(self, arg_1)。请记住,cherrypy中的默认调度程序就像树一样。如果存在一个属性(分支),该属性具有对路径其余部分的解释控制,则可以始终组成clases而不是定义单个方法,作为替代方法使用Routes或Method调度程序。