Cherrypy 重复使用模块并隐藏暴露路径

2024-10-02 22:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我开发了两个独立的模块,最终生成一个可以传递给cherrypy的quickstart函数的对象,比如chp.quickstart(the_app_object, '/', some_config)。我在some_config中使用的dispatcherchp.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路径段映射到应用程序装入点(在本例中是'/')上的应用程序对象的属性,然后调用与请求方法(GET、POST、,如果对象实例作为exposed属性(由@cherrypy.expose设置),这意味着到hostname:port/path_app_3/app_1的POST将有效地调用<base_app_object>.path_app_3.app_1.POST()

我想知道是否有可能在层次结构中“不暴露”公开的方法

显然,在第三个应用程序中简单地重命名属性是行不通的。我不确定使用字典或其他集合是否会有所帮助,因为这感觉像是一些依赖于库的黑客没有正确地访问嵌套集合而不是属性(假设这足以中断路径匹配过程)


Tags: pathapp应用程序ifobjectportpostmay