Using basic Flask vs Flask-RESTful for API development
我将为即将到来的应用程序开发REST API。我决定为此使用Python Flask。但是目前,我不知道使用哪个选项。我应该使用基本的Flask软件包还是带有Flask-RESTful扩展的Flask。我发现两者都有优点和缺点。
以下是两个在Flask和Flask-RESTful中执行相同操作的API的示例:
烧瓶版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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,我无法获得单个资源来服务多个相关端点,例如
牢记以上几点,可以在Flask-RESTful中为子资源创建许多类吗?还是我最好使用Flask?还是Flask-RESTful提供了一些比Flask真正好的优势?
REST是一种非常灵活的体系结构,但是仅使用Flask的方法中有几点值得考虑,Flask-RESTful鼓励您远离:
按照惯例,单个资源(例如/ users / 1234)上的GET是由该资源的唯一标识符组成的。不能保证用户名是唯一的,因此将其作为URI中的标识符(例如/ users / joe)会很冒险。
当您访问集合中的用户时,最好始终使用复数名词(而不是像Flask示例中所示的/ user / ...)。
在创建和使用POST时,除非客户端指定ID(在这种情况下,它必须能够保证唯一性,所以唯一有效的ID几乎就是UUID),否则您可以将其发布到集合URI中(例如/ users /)。
两种方法都可以使用,但是使用Flask-RESTful,您会发现,遵循这些准则,您的课程将与您的资源更加紧密地匹配,并且您不会看到所描述的课程的泛滥。
https://flask-restful.readthedocs.io/en/latest/quickstart.html#full-example演示了一个非常相似的用例。
我建议您改用Flask-RESTplus,它将为您提供完整的Swagger支持。
就仅使用Flask而言,我想说获得Swagger功能对于选择Flask-Restplus也是一个很大的选择。