Есть ли способ добавить несколько методов 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())
Другие вопросы по тегам