繁体   English   中英

使用基本的 Flask 与 Flask-RESTful 进行 API 开发

[英]Using basic Flask vs Flask-RESTful for API development

我即将为我们即将推出的应用程序开发 REST API。 我决定为此使用 Python Flask。 但在这一点上,我不知道使用哪个选项。 我应该使用基本的 Flask package 还是 Flask 和 Flask-RESTful 扩展。 我发现两者都有一些优点和缺点。

下面是两个 API 做同样事情但在 Flask 和 Flask-RESTful 中的示例:

Flask 版本

from flask import Flask, jsonify

app = Flask(__name__)

usersList = ['Aaron', 'Bianca', 'Cat', 'Danny', 'Elena']

@app.route('/users', methods=['GET'])
def users():
    return jsonify({ 'users': [user for user in usersList] })

@app.route('/user/<int:id>', methods=['GET'])
def userById(id):
    return jsonify({ 'username': usersList[id]  })

@app.route('/user/<string:name>', methods=['GET'])
def getUserByName(name):
    # Show some user information
    return "Some info"

@app.route('/user/<string:name>', methods=['POST'])
def addUserByName(name):
    usersList.append(name)
    return jsonify({ 'message': 'New user added'  })

app.run()

Flask-RESTful 版本

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

usersList = ['Aaron', 'Bianca', 'Cat', 'Danny', 'Elena']

class UsersList(Resource):
    def get(self):
        return { 'users' : [ user for user in usersList  ] }, 200


class UserById(Resource):
    def get(self, id):
        return { 'username': usersList[id] }


class UserByName(Resource):
    def post(self, name):
        usersList.append(name)

        return { 'message': 'New user added'}


api.add_resource(UsersList, '/users')
api.add_resource(UserById, '/user/<int:id>')
api.add_resource(UserByName, '/user/<string:name>')

app.run()

使用 Flask-RESTful,我无法获得单个资源来服务多个相关端点,例如GET /user/<int:id>GET /user/<string:name>GET /user/<int:id>/friends等。而且我不知道为简单的子资源创建新类是否是一种好习惯,因为我最终可能会得到很多类。 由于这个原因,我更倾向于只使用 Flask 因为只定义了函数并且可以根据我的需要自由定义端点。

牢记以上几点,可以在 Flask-RESTful 中为子资源创建许多类吗? 还是我最好使用 Flask? 或者 Flask-RESTful 比 Flask 提供了一些非常好的优势?

REST 是一种非常灵活的架构,但在您仅使用 Flask 的方法中,有几点值得考虑,Flask-RESTful 鼓励您远离:

  1. 按照惯例,对单个资源(例如 /users/1234)的 GET 是通过资源的唯一标识符。 不能保证用户的名称是唯一的,因此将其作为 URI 中的标识符(例如 /users/joe)是有风险的。

  2. 当您访问集合中的用户时,最好始终使用复数名词(而不是,正如您在 Flask 示例中所示,/user/...)。

  3. 当您创建和使用 POST 时,除非您的客户端指定了 id(在这种情况下它必须能够保证唯一性,因此几乎唯一有效的 id 将是 UUID),您可以只发布到集合 URI (例如/用户/)。

两者都可以,但是使用 Flask-RESTful,您会发现当您遵循这些指南时,您的类与您的资源更加匹配,并且您不会看到您描述的类的激增。

https://flask-restful.readthedocs.io/en/latest/quickstart.html#full-example演示了一个非常相似的用例。

我建议您改用Flask-RESTplus ,这将为您提供全面的 Swagger 支持。

关于仅使用 Flask,我想说获得 Swagger 功能也是选择 Flask-Restplus 的一个重要因素。

不知道为什么没有人提到标准 Flask 也支持 REST-API 的事实,即你真的不需要导入 REST 包来利用标准 Flask 包中缺少的东西。

您完全可以根据自己的舒适度自由选择所需的任何方法,并且选择的任何方法都不应影响最终结果的功能。

我知道我们可能倾向于使用适合特定工作的东西,但有时,在编码世界中,无论您必须编写多少额外的代码行,舒适度都很重要。

希望这能回答您的疑问。

在我个人看来,Flask-RESTful 滥用了 OOP 的使用,对我来说感觉不是一种直观的方法。 我更喜欢 REST API 开发的“普通 Flask”,而不是 Flask-RESTful。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM