有没有办法在Falcon的单个类资源下添加多个on_get方法?

时间:2018-10-03 00:54:42

标签: python-3.x api falconframework

如果假设我们要在单个类资源中实现以下端点,是否有办法在单个资源中放置多个 on_get 方法,以区分每个端点?因为将它们放在非常紧密的联系中,所以将它们置于单一类别下是很有意义的。

可能的终点:

/ api / {id}

/ api / v1 / {id}

/ api / v1 / appended / {id}

2 个答案:

答案 0 :(得分:3)

是的,在Falcon 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}(),对on_post_{suffix}()的POST请求,等等。   这样,可以将多个紧密相关的路由映射到同一资源。对于   例如,单个资源类可以使用后缀的响应者来区分   请求单个商品与这些相同商品的集合。

答案 1 :(得分:0)

我不确定我是否正确理解您的要求!!!但我希望以下代码对所有上述路由具有相同的逻辑会有所帮助:

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())