如果假设我们要在单个类资源中实现以下端点,是否有办法在单个资源中放置多个 on_get 方法,以区分每个端点?因为将它们放在非常紧密的联系中,所以将它们置于单一类别下是很有意义的。
可能的终点:
/ api / {id}
/ api / v1 / {id}
/ api / v1 / appended / {id}
答案 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())