Использование базового Flask против Flask-RESTful для разработки API - PullRequest
0 голосов
/ 14 декабря 2018

Я собираюсь разработать REST API для нашего будущего приложения.Я решил использовать Python Flask для этого.Но на данный момент я не знаю, какой вариант использовать.Должен ли я использовать базовый пакет Flask или Flask с расширением Flask-RESTful.Я нашел некоторые преимущества и недостатки в обоих.

Ниже приведен пример двух API, выполняющих одно и то же, но в Flask и Flask-RESTful:

Версия Flask :

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?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

REST является довольно гибкой архитектурой, но есть несколько моментов, о которых стоит подумать в вашем подходе, использующем только Flask, от которого Flask-RESTful вас не устраивает:

  1. По соглашению,GET для одного ресурса (например, / users / 1234) осуществляется по уникальному идентификатору ресурса.Имя пользователя не может быть гарантировано уникальным, поэтому было бы рискованно использовать его в качестве идентификатора в URI (например, /users/joe).

  2. Когда выдоступ к пользователям в коллекции, лучше придерживаться во всем существительном множественного числа (нет, как показано в примере с Flask, / user / ...).

  3. Когда вы создаете и используете POST, за исключением случаев, когда ваш клиент указывает идентификатор (в этом случае он должен быть в состоянии гарантировать уникальность, так что практически единственный действительный идентификатор будетUUID), вы можете публиковать только в URI коллекций (например, /users/).

Любой из них будет работать, но с Flask-RESTful вы обнаружите, что, следуя этим рекомендациямваш класс гораздо ближе соответствует вашим ресурсам, и вы не увидите увеличения числа описываемых вами классов.

Очень похожий пример использования демонстрируется на https://flask -restful.readthedocs.io / en/latest/quickstart.html#full-example.

0 голосов
/ 14 декабря 2018

Я бы порекомендовал вам использовать Flask-RESTplus , что обеспечит вам полную поддержку Swagger.

Что касается простого использования Flask, я бы сказал, что получение функциональности Swagger - это большой выбор для Flask-Restplus.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...