【问题标题】:GET with and without parameter in flask-restful在 flask-restful 中带和不带参数的 GET
【发布时间】:2024-04-20 19:10:02
【问题描述】:

以下内容让我觉得不雅,但它确实有效。有没有办法让 flask-restful 使用 相同的 资源类来处理两种标准的 get(即获取所有内容并获取一项)?

谢谢。

from flask_restful import Resource
# ...

class People(Resource):
    def get(self):
        return [{'name': 'John Doe'}, {'name': 'Mary Canary'}]

class Person(Resource):
    def get(self, id):
        return {'name': 'John Doe'}
# ...

api.add_resource(People, '/api/people')
api.add_resource(Person,  '/api/people/<string:id>')

【问题讨论】:

  • 抱歉,我不这么认为。每当我尝试时,我都会收到“TypeError: get() missing 1 required positional argument”错误。如果位置参数可以是可选的,并且在未传递时设置为 None 会很好,但也许有一个原因它不能那样工作。
  • 我终于对它感到非常沮丧,以至于我测试了一个概念证明来替代实现——GIST 在这里bit.ly/1RVzWm9。我相信,并且在这里说过:github.com/flask-restful/flask-restful/issues/114 其原因是 Flask-Restful 遵循了考虑到 Flask 的 add_url_rule 实施的阻力最小的路径。

标签: flask-restful


【解决方案1】:

我想这就是你要找的东西:

from flask_restful import Resource
# ...


class People(Resource):

    def get(self, id=None):
        if not id:
            return {'name': 'John Doe'}
        return [{'name': 'John Doe'}, {'name': 'Mary Canary'}]


api.add_resource(People, '/api/people', '/api/people/<id>')

您可以对 id 购买进行限制,将其作为参数添加到请求解析器:

parser.add_argument('id', location='view_args', type=..)

【讨论】:

    【解决方案2】:

    是的,请查看argument parsing documentation。如果需要,这将使您可以灵活地围绕随请求收到的参数创建一些逻辑。

    from flask_restful import Api, Resource, reqparse
    # ...
    
    api = Api(app)
    parser = reqparse.RequestParser()
    parser.add_argument('id')
    
    class People(Resource):
    def get(self):
        data = parser.parse_args()
        if not data['id']:
            return [{'name': 'John Doe'}, {'name': 'Mary Canary'}]
        else:
            # data lookup using id
            # for example using SQLAlchemy...
            # person = Person.query.filter_by(id = data['id']).first_or_404()
            return {'id': data['id'], 'name': 'John Doe'}
    
    api.add_resource(People, '/api/people')
    

    然后尝试:

    • localhost:/api/people
    • localhost:/api/people?id=1

    【讨论】:

    • 我认为这不是 restful 的实现方式.. imo
    • 可能不符合 REST 规范,但 flask-restful 仍然可以使用
    • 是的,我没有说它不可能,我认为它很好,但我只是说如果它的 REST 不是它应该实现的方式,因为一些初学者搜索并且会偶然发现这个可能会认为这是应该实现的方式:)
    最近更新 更多