Получить список всех маршрутов, определенных в приложении 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