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



如果假设我们想在单个类资源中实现以下端点,有没有办法在单个资源中放置多个on_get方法来区分每个端点?因为放在单个类下是有意义的,因为它们几乎密切相关。

可能的终点:

/api/{id}

/api/v1/{id}

/api/{id}/appended(英语:api/{id}/appended(

/api/v1/appended/{id}

是的,在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的文档

如果提供了后缀,猎鹰会将GET请求映射到on_get_{suffix}()、对on_post_{suffix}()的 POST 请求等。在此 方式,多个密切相关的路由可以映射到同一资源。为 例如,单个资源类可以使用带后缀的响应程序来区分 对单个项目的请求与这些相同项目的集合的请求。

如果您想在Falcon的文档中看到这种用法的另一个相关示例,请在此处阅读。

Falcon 2.0的更新:

现在猎鹰2.0支持开箱即用的"后缀"add_route。有关更多信息,请参阅此处。您可以使用以下代码:

class CatalogItem(object):
# Logic for /api/{id}
def on_get(self, req, resp, id):
resp.res.status = falcon.HTTP_200
res.body = json.dumps({'status': True, 'message': 'success'})

# Logic for /api/v1/{id}
def on_get_v1(self, req, resp, id):        
resp.res.status = falcon.HTTP_200
res.body = json.dumps({'status': True, 'message': 'success'})

# Logic for /api/v1/appended/{id}
def on_get_appended(self, req, resp, id):
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(), suffix='v1')
app.add_route('/api/v1/appended/{id}', CatalogItem(), suffix='appended')

对于低于V2.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())

相关内容

  • 没有找到相关文章

最新更新