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

时间:2018-12-14 10:07:09

标签: python api flask

我将为即将到来的应用程序开发一个REST API。我决定为此使用Python Flask。但是目前,我不知道使用哪个选项。我应该使用基本的Flask软件包还是带有Flask-RESTful扩展名的Flask。我发现两者都有优点和缺点。

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

烧瓶版本

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真正好的优势?

3 个答案:

答案 0 :(得分:3)

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

  1. 按照惯例,单个资源(例如/ users / 1234)上的GET通过该资源的唯一标识符来实现。不能保证用户名是唯一的,因此将其作为URI中的标识符(例如/ users / joe)会很冒险。

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

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

这两种方法都可以使用,但是使用Flask-RESTful,您会发现,遵循这些准则,您的课程与您的资源更加匹配,并且您不会看到所描述的课程的泛滥。

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

答案 1 :(得分:0)

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

就仅使用Flask而言,我想说要获得Swagger功能也是选择Flask-Restplus的重要条件。

答案 2 :(得分:0)

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

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

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

希望这能解答您的疑问。