Cherrypy-重用模块并隐藏暴露的路径

时间:2018-12-07 13:48:02

标签: python rest cherrypy

我已经开发了两个单独的模块,最终产生一个对象,该对象可以传递给cherrypy的快速启动功能,例如chp.quickstart(the_app_object, '/', some_config)。我在dispatcher中使用的some_configchp.dispatch.MethodDispatcher()

现在,我需要开发一个包装这两个模块的模块。 当我在第三个应用程序中分别引用前两个应用程序时,会遇到这样的情况:

import cherrypy    

@cherrypy.expose
class HandlerApp1(object):
    def POST(self):
        return "output_app_1"

#If mounted, HandlerApp1 may be accessed at hostname:port/path_app_1
class App1(object):
    path_app_1 = HandlerApp1()

############################################################

@cherrypy.expose
class HandlerApp2(object):
    def POST(self):
        return "output_app_2"

#If mounted, HandlerApp2 may be accessed at hostname:port/path_app_2
class App2(object):
    path_app_2 = HandlerApp2()

############################################################

#If mounted, HandlerApp1 may be accessed at hostname:port/wrapped_1/path_app_1
#and HandlerApp2 at hostname:port/wrapped_2/path_app_2
class App3(object):
    wrapped_1 = App1()
    wrapped_2 = App2()

我想在一次调用中同时调用两个POST方法的东西,有这样的东西(从上面继续):

@cherrypy.expose
class HandlerApp3(object):
    app_1 = App1()
    app_2 = App2()

    def POST(self):
        return app_1.POST() + app_2.POST()

##If mounted, HandlerApp3 may be accessed at hostname:port/path_app_3
class App3(object):
    path_app_3 = HandlerApp3()

但是,如第二部分所述具有App3,可能仍会在hostname:port/path_app_3/app_1hostname:port/path_app_3/app_2上访问单个旧应用,这是我要避免的。

据我了解,这是因为所选的调度程序(chp.dispatch.MethodDispatcher())将url路径段沿应用程序安装点(在本例中为'/')映射到应用程序对象的属性,然后调用了如果对象实例为exposed属性(由@cherrypy.expose设置),则对应于请求方法(GET,POST等)的属性对象方法,这意味着对hostname:port/path_app_3/app_1的POST有效地调用<base_app_object>.path_app_3.app_1.POST()

我想知道是否有可能在层次结构中以某种方式“未公开”公开的方法

显然,在第三个应用程序中仅重命名属性是不会的。我不确定使用字典还是其他集合会有所帮助,因为感觉有些依赖库的黑客无法正确访问嵌套集合而不是属性(假设这足以破坏路径匹配过程。

0 个答案:

没有答案