web-dev-qa-db-fra.com

Utilisation de base Flask vs Flask-RESTful pour le développement d'API

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?

14
Shahlin Ibrahim

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:

  1. 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).

  2. 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/...).

  3. 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 .

4
rich carter

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.

2
StefanE