Je suis sur le point de développer une API REST pour notre prochaine application. J'ai décidé d'utiliser Python Flask pour cela) Mais à ce stade, je ne sais pas quelle option utiliser. Dois-je utiliser le package de base Flask ou Flask avec l'extension Flask-RESTful). J'ai trouvé des avantages et des inconvénients dans les deux.
Voici un exemple de deux API faisant la même chose mais dans Flask et Flask-RESTful:
version flacon:
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()
version 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()
En utilisant Flask-RESTful, je ne peux pas obtenir une seule ressource pour servir plusieurs points de terminaison liés comme GET /user/<int:id>
, GET /user/<string:name>
, GET /user/<int:id>/friends
etc. Et je ne sais pas si la création de nouvelles classes pour de simples sous-ressources est une bonne pratique car je vais probablement me retrouver avec de nombreuses classes. Pour cette raison, je suis plus enclin à utiliser simplement Flask car seules les fonctions sont définies et les points de terminaison peuvent être librement définis selon mes besoins.
En gardant à l'esprit ce qui précède, est-il correct de créer de nombreuses classes pour les sous-ressources dans Flask-RESTful? Ou suis-je préférable d'utiliser Flask? Ou Flask-RESTful offre de très bons avantages par rapport à Flask?
REST est une architecture assez flexible, mais il y a quelques points à considérer dans votre approche en utilisant uniquement Flask, ce que Flask-RESTful vous encourage à éviter:
Par convention, un GET sur une seule ressource (par exemple/users/1234) se fait par un identifiant unique pour la ressource. Le nom d'un utilisateur ne peut pas être garanti unique, il serait donc risqué de l'avoir comme identifiant dans l'URI (par exemple/users/joe).
Lorsque vous accédez à des utilisateurs dans une collection, il est préférable de conserver le nom pluriel tout au long (pas, comme vous le montrez dans votre Flask,/user/...).
Lorsque vous créez et utilisez POST, à moins que votre client ne spécifie l'ID (auquel cas il doit pouvoir garantir l'unicité, donc à peu près le seul ID valide serait un UUID), vous pouvez publier uniquement l'URI des collections (par exemple/utilisateurs /).
Les deux fonctionnent, mais avec Flask-RESTful, vous constaterez que lorsque vous suivez ces directives, votre classe correspond beaucoup plus à vos ressources et vous ne verrez pas la prolifération des classes que vous décrivez.
Un cas d'utilisation très similaire est illustré à https://flask-restful.readthedocs.io/en/latest/quickstart.html#full-example .
Je vous recommanderais d'utiliser Flask-RESTplus à la place, cela vous donnera un support complet de Swagger.
En ce qui concerne l'utilisation de Flask, je dirais que l'obtention de la fonctionnalité Swagger est très importante pour choisir Flask-Restplus également.