I’m about to develop a REST API for our upcoming application. I have decided to use Python Flask for it. But at this point, I don’t know which option to use. Should I be using the basic Flask package or Flask with Flask-RESTful extension. I’ve found some advantages and disadvantages in both.

Below is an example of two APIs doing the same thing but in Flask and Flask-RESTful:

Flask version:

from flask import Flask, jsonify

app = Flask(__name__)

usersList = ['Aaron', 'Bianca', 'Cat', 'Danny', 'Elena']

@app.route("https://stackoverflow.com/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 version:

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, "https://stackoverflow.com/users")
api.add_resource(UserById, '/user/<int:id>')
api.add_resource(UserByName, '/user/<string:name>')

app.run()

Using Flask-RESTful, I cannot get a single resource to serve multiple related endpoints like GET /user/<int:id>, GET /user/<string:name>, GET /user/<int:id>/friends etc. And I don’t know if creating new classes for simple sub-resources is a good practice because I’ll probably end up with many classes. Due to this reason, I’m more inclined towards using just Flask since only functions are defined and the endpoints can be freely defined as per my needs.

Keeping the above in mind, is it okay to create many classes for sub-resources in Flask-RESTful? Or am I better of using Flask? Or Flask-RESTful provides some really good advantages over Flask?

REST is a pretty flexible architecture, but there’s a few points worth thinking about in your approach using just Flask, which Flask-RESTful is encouraging you away from:

  1. By convention, a GET on a single resource (e.g. /users/1234) is by a unique identifier for the resource. The name of a user can’t be guaranteed to be unique, so it would be risky to have it as an identifier within the URI (e.g. /users/joe).

  2. When you access users within a collection, it’s better to stick with the plural noun throughout (not, as you show in your Flask example, /user/…).

  3. When you’re creating and using POST, unless your client is specifying the id (in which case it has to be able to guarantee uniqueness, so pretty much the only valid id would be a UUID), you can post to just the collections URI (e.g. /users/).

Either will work, but with Flask-RESTful you’ll find that when you follow those guidelines, your class matches your resources much more closely and you won’t see the proliferation of classes you describe.

A very similar use case is demonstrated at https://flask-restful.readthedocs.io/en/latest/quickstart.html#full-example.

I would recommend you to use Flask-RESTplus instead, that will give you full Swagger support.

In regards of just using Flask, I would say getting the Swagger functionality is a big one to choose Flask-Restplus also.

Not sure why no one mentioned the fact that standard Flask is also REST-API enabled i.e. you really don’t need to import the REST package to avail something that is missing in standard Flask package.

You are absolutely free to choose whichever you want depending upon your comfort level and any method chosen shouldn’t affect your end-result functionality.

I understand that we can be inclined towards using something that is meant for a specific job but sometimes, in coding world, comfort matters regardless of how many extra lines of code you have to write.

Hope this answers your query.