Получить список всех маршрутов, определенных в приложении Falcon

У меня есть RESTful маршруты в приложении Falcon, определенные как упрощенные коды ниже. Мой вопрос, как получить список всех маршрутов с их сопоставленными обработчиками?

Мои результаты поиска в Google мало полезны - одна подобная проблема решена для приложения Flask здесь, но ни одна страница не рассказывает о Falcon.

api = falcon.API(middleware=middleware)
api.add_route('/v1/model_names1', SomeHandlerMappingResource1())
api.add_route('/v1/model_names2', SomeHandlerMappingResource2())

class SomeHandlerMappingResource1:
    def on_get(self, req, resp):
        pass # some biz logic of GET method
    def on_post(self, req, resp):
        pass # some biz logic of POST method
    # etc.

class SomeHandlerMappingResource2:
    pass # similar to handler resource 1 above 

2 ответа

Приведенный ниже код вернет список кортежей с URL и соответствующими им ресурсами:

def get_all_routes(api):
    routes_list = []

    def get_children(node):
        if len(node.children):
            for child_node in node.children:
                get_children(child_node)
        else:
            routes_list.append((node.uri_template, node.resource))
    [get_children(node) for node in api._router._roots]
    return routes_list

Выход

[
    ('/v1/things', <v1.v1_app.ThingsResource object at 0x7f555186de10>), 
    ('/v2/things', <v2.v2_app.ThingsResource object at 0x7f5551871470>), 
    ('/v3/things/{name}', <v3.v3_app.ThingsResource object at 0x7f5551871ba8>)
]

Я прочитал пакет и получил его, однако я не знаю ни одного встроенного метода, который будет возвращать этот результат.


Если вам не нравится вышеуказанная функция, вы можете добиться чего-то похожего, расширив класс API.

Я сделал репозиторий Github для управления версиями приложения Falcon, из которого вы можете получить представление о разделении URL-адресов и их относительных ресурсов. Github Link

Вы можете иметь список маршрутов и добавлять их с помощью Extended API класса

URL и ресурсы будут выглядеть так:

from v1.v1_app import things

urls = [
    ('/things', things),
]

Возможно, в вашей логике есть небольшая пустая область, которую я реализовал, и в некоторых случаях она не достигает некоторых конечных точек. Это моя версия (разумеется, основанная на вашей):

      def get_all_routes(api: App) -> List:
    routes_list = []

    def get_children(node):
        if len(node.children):
            if node.uri_template:
                routes_list.append((node.uri_template, node.resource))
            for child_node in node.children:
                get_children(child_node)
        else:
            routes_list.append((node.uri_template, node.resource))

    [get_children(node) for node in api._router._roots]
    return routes_list
Другие вопросы по тегам