Cherrypy - повторно использовать модули и скрывать открытые пути - PullRequest
0 голосов
/ 07 декабря 2018

Я разработал два отдельных модуля, которые в конечном итоге дают объект, который можно передать функции быстрого запуска cherrypy, например chp.quickstart(the_app_object, '/', some_config).dispatcher, который я использую в some_config - это chp.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_1 и hostname:port/path_app_3/app_2, чего я хотел бы избежать.

Как я понимаю, это потому, что выбранный диспетчер (chp.dispatch.MethodDispatcher()) отображает сегменты пути URL в атрибуты объекта приложения вдоль монтирования приложенияточка (в данном случае '/'), а затем вызывает метод объекта атрибута, соответствующий методу запроса (GET, POST и т. д.), если экземпляр объекта является атрибутом exposed (который установлен @cherrypy.expose),это означает, что POST к hostname:port/path_app_3/app_1 будет эффективно вызывать <base_app_object>.path_app_3.app_1.POST().

Мне было интересно, можно ли как-нибудь "разоблачить" открытые методы вниз по иерархии .

Простое переименование атрибутов в третьем приложении, очевидно, не подойдет.Я не уверен, поможет ли использование словарей или другой коллекции, так как кажется, что какой-то хак полагается на то, что библиотека неправильно обращается к вложенным коллекциям вместо атрибутов (при условии, что этого будет достаточно, чтобы нарушить процесс сопоставления пути.

...