Есть ли способ добавить несколько методов on_get в один ресурс класса в Falcon?
Если предположить, что мы хотим реализовать следующие конечные точки в одном ресурсе класса, есть ли способ поместить несколько методов on_get в один ресурс, которые бы дифференцировали каждую конечную точку? Потому что имеет смысл отнести к одному классу, поскольку они в значительной степени тесно связаны между собой.
Возможные конечные точки:
/ API /{ID}
/ API /v1/{ID}
/ API / v1 / прилагается /{ID}
1 ответ
Да, в Соколе 2.0 add_route
метод поддерживает suffix
Аргумент ключевого слова, который позволяет использовать один класс ресурсов для нескольких конечных точек. Пример кода:
class UserResource:
def on_get(self, req, resp):
resp.media = self.repository.find_all()
def on_get_single(self, req, resp, user_id):
resp.media = self.repository.find_user(user_id)
resource = UserResource()
api = falcon.API()
api.add_route('/users', resource)
api.add_route('/users/{user_id}', resource, suffix='single')
Из документов falcon.API.add_route
Если указан суффикс, Falcon отобразит запросы GET на
on_get_{suffix}()
, POST проситon_post_{suffix}()
и т. д. Таким образом, несколько тесно связанных маршрутов могут быть сопоставлены одному и тому же ресурсу. Например, один класс ресурсов может использовать ответчики с суффиксами, чтобы различать запросы для одного элемента и коллекцию тех же элементов.
Я не уверен, что правильно понимаю ваше требование или нет!!! Но я надеюсь, что следующий код поможет вам, если у вас одинаковая логика для всех указанных маршрутов:
class CatalogItem(object):
def on_get(self, id):
return self._collection.find_one(id)
app = falcon.API()
app.add_route('/api/{id}', CatalogItem())
app.add_route('/api/v1/{id}', CatalogItem())
app.add_route('/api/v1/appended/{id}', CatalogItem())
Этот код направляет к тому же методу on_get. Но я все же предлагаю вам написать отдельный класс с другим методом on_get. И если большая часть кода похожа, вы можете написать вспомогательную функцию и вызывать ее при необходимости.
Также, как вы упомянули, что "вы хотите поместить несколько методов on_get в один ресурс, который будет дифференцировать каждую конечную точку", что невозможно, но есть обходной путь.
Вы можете использовать один и тот же метод on_get, и в зависимости от маршрута вы можете использовать различную логику для каждого.
class CatalogItem(object):
def on_get(self, req, resp, id):
route_path = str(req.path)
if route_path.startswith("/api/v1/appended/"):
# Logic for /api/v1/appended/
resp.res.status = falcon.HTTP_200
res.body = json.dumps({'status': True, 'message': 'success'})
elif route_path.startswith("/api/v1/"):
# Logic for /api/v1/
resp.res.status = falcon.HTTP_200
res.body = json.dumps({'status': True, 'message': 'success'})
elif route_path.startswith("/api/"):
# Logic for /api/
resp.res.status = falcon.HTTP_200
res.body = json.dumps({'status': True, 'message': 'success'})
app = falcon.API()
app.add_route('/api/{id}', CatalogItem())
app.add_route('/api/v1/{id}', CatalogItem())
app.add_route('/api/v1/appended/{id}', CatalogItem())