当前位置: 首页 > 面试题库 >

Flask RESTful API多个复杂端点

红存
2023-03-14
问题内容

在我的Flask-RESTful API中,假设我有两个对象,用户和城市。这是一对多关系。现在,当我创建我的API并向其中添加资源时,我似乎可以做的就是将非常简单的通用URL映射到它们。这是代码(不包括无用的东西):

class UserAPI(Resource):  # The API class that handles a single user
  def __init__(self):
    # Initialize

  def get(self, id):
    # GET requests

  def put(self, id):
    # PUT requests

  def delete(self, id):
    # DELETE requests

class UserListAPI(Resource):  # The API class that handles the whole group of Users
  def __init__(self):

  def get(self):

  def post(self):

api.add_resource(UserAPI, '/api/user/<int:id>', endpoint='user')
api.add_resource(UserListAPI, '/api/users/', endpoint='users')

class CityAPI(Resource):
  def __init__(self):

  def get(self, id):

  def put(self, id):

  def delete(self, id):

class CityListAPI(Resource):
  def __init__(self):

  def get(self):

  def post(self):

api.add_resource(CityListAPI, '/api/cities/', endpoint='cities')
api.add_resource(CityAPI, '/api/city/<int:id>', endpoint='city')

如你所见,我可以做所有想实现非常基本的功能的事情。我可以获取,发布,放置和删除两个对象。但是,我的目标有两个:

(1)能够使用其他参数(例如城市名称)而不只是城市ID进行请求。它看起来像:
api.add_resource(CityAPI, '/api/city/<string:name>', endpoint='city')
除非它不会抛出此错误:

AssertionError:视图函数映射正在覆盖现有的终结点函数

(2)能够将两个资源合并到一个请求中。假设我想让所有与某个城市相关联的用户。在REST URL中,它应类似于:
/api/cities/<int:id>/users

如何用Flask做到这一点?我将其映射到哪个端点?

基本上,我正在寻找使API从基本变为可用的方法。感谢你的任何想法/建议


问题答案:

你犯了两个错误。

首先,Flask-RESTful使你认为资源是通过单个URL实施的。实际上,你可以有许多不同的URL返回相同类型的资源。在Flask-RESTful中,你将需要Resource为每个URL 创建一个不同的子类,但是从概念上讲,这些URL属于同一资源。注意,实际上,你已经为每个资源创建了两个实例来处理列表和单个请求。

你犯的第二个错误是你希望客户端知道你API中的所有URL。这不是构建API的好方法,理想情况下,客户端只知道几个顶级URL,然后从顶级响应中的数据中发现其余URL。

在你的API中,你可能希望将/api/users和/api/cities作为顶级API 公开。各个城市和用户的URL将包含在响应中。例如,如果我调用http://example.com/api/users以获取用户列表,则可能会收到以下响应:

{
    "users": [ 
        {
            "url": "http://example.com/api/user/1",
            "name": "John Smith",
            "city": "http://example.com/api/city/35"
        },
        {
            "url": "http://example.com/api/user/2",
            "name": "Susan Jones",
            "city": "http://example.com/api/city/2"
        }
    ]
}

请注意,用户的JSON表示包括该用户的URL以及城市的URL。客户不需要知道如何构建它们,因为它们已经被赋予了它。

按名称获取城市
对于一个城市的网址/api/city/<id>,并且网址以获得城市的完整列表/api/cities,因为你拥有它定义。

如果你还需要按城市名称搜索城市,则可以扩展“城市”端点来进行。例如,你可以使用表格中的URL /api/cities/<name>返回与指定为的搜索字词匹配的城市列表<name>

使用Flask-RESTful,你将需要为此定义一个新的Resource子类,例如:

    class CitiesByNameAPI(Resource):
        def __init__(self):
            # ...    
        def get(self, name):
            # ...

    api.add_resource(CitiesByNameAPI, '/api/cities/<name>', endpoint = 'cities_by_name')

获取属于某个城市的所有用户
当客户要求一个城市时,它应该得到一个包含URL的响应,以吸引该城市的用户。例如,假设从/api/users上面的响应中我想了解第一个用户的城市。因此,现在我向发送请求http://example/api/city/35,并返回以下JSON响应:

{
    "url": "http://example.com/api/city/35",
    "name": "San Francisco",
    "users": "http://example/com/api/city/35/users"
}

现在我有了城市,这给了我一个URL,我可以使用它来获取该城市中的所有用户。

请注意,你的URL丑陋或难以构建都没关系,因为客户端不需要从头开始构建大多数URL,它只是从服务器获取它们。这也使你将来可以更改URL的格式。

要实现按城市吸引用户的网址,你可以添加另一个Resource子类:

    class UsersByCityAPI(Resource):
        def __init__(self):
            # ...    
        def get(self, id):
            # ...

    api.add_resource(UsersByCityAPI, '/api/cities/<int:id>/users', endpoint = 'users_by_city')

我希望这有帮助!



 类似资料:
  • 问题内容: 我想用cakephp进行这样的查询: 这是我的$ conditions代码: 我正在使用Debugger :: dump()方法显示结果,并且结果仅使用最后一个“ OR”条件,而不是同时使用“ OR”条件: 我的问题是,如何进行查询以同时使用“ OR”条件? 请尽快回复..在此先感谢:) 问题答案: 请尝试以下方法: 将是 任何阵列没有指定,或者是。无需手动指定。

  • 我在计算一个方法的时间复杂度: D总是小于或等于P,但我的怀疑是在后四个。我的时间复杂度是O(2p^3),但我读过2可以像O(p^3)一样去掉。这些是正确的吗?

  • 上篇的标记算法中,谈到这个O(K)的算法是一个指数级复杂度的算法,其实对那道题目本身来说,K是固定的,既然不是输入,那也无所谓复杂度,之所以有O(K)这种说法,是把K当做一种输入了,这是看待输入的角度问题,倒不用深究。考虑一个更简化的算法(python代码,设输入n是正整数): def f(n): i = 0 while i < n: i += 1

  • Docker命令将Docker端口发布到。但是当我需要发布两个端口时如何处理和?

  • 我得到了以下许多映射。 我想检索所有与Classe2实体有关系的Class1实体,它们的类2Id=1和类2Id=2和类2Id=3。{1,2,3} 或者,要筛选在其class2列表上具有值的Class1实体,请使用值class2Id=1、class2Id=2和class2Id=3的class2实体 例如: 如果在联接表上,我得到了以下值。 对于这个例子,结果将是类1Id为1和6的类1。因为类1实体,

  • 问题内容: 有时你想过滤具有多个条件的a: 或者你可以做同样的复杂条件和单 filter: 我的猜测是第二种方法具有更好的性能特征,但我不知道。 第一种方法赢得了可读性,但是哪种性能更好? 问题答案: 两种选择都必须执行的代码是如此相似,以致你无法可靠地预测结果。底层的对象结构可能有所不同,但这对热点优化器没有挑战。因此,这取决于其他周围条件,如果有任何差异,它们将使执行速度更快。 组合两个过滤器