我即将为我们即将推出的应用程序开发一个 REST API。我决定使用 Python Flask。但此时,我不知道该使用哪个选项。我应该使用基本 Flask 包还是带有 Flask-RESTful 扩展的 Flask。我发现两者都有一些优点和缺点。
下面是两个 API 执行相同操作的示例,但在 Flask 和 Flask-RESTful 中:
烧瓶版本:
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 鼓励您远离:
按照惯例,对单个资源(例如 /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 的一个重要因素。