
Flask-RESTful is an extension for the Flask web framework that simplifies the process of building RESTful APIs. In this tutorial, we’ll explore how to build a simple RESTful API using Flask-RESTful in Python. By the end of this tutorial, you’ll have a basic understanding of how to create, retrieve, update, and delete (CRUD) resources using this library.
Before we begin, you’ll need the following installed on your system:
First, let’s create a virtual environment and install the necessary packages:
$ python3 -m venv env
$ source env/bin/activate
(env) $ pip install Flask Flask-RESTful
With the packages installed, we can now start building our API.
Let’s build a simple API for managing a list of tasks. We’ll create endpoints for adding, retrieving, updating, and deleting tasks.
Create a new file called app.py and import the necessary libraries:
from flask import Flask, request
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
Here, we’ve imported Flask and request from the Flask library and Resource and Api from the Flask-RESTful extension. We’ve also initialized a new Flask app and a new API instance.
Now, let’s create a Task resource by subclassing Resource and implementing the necessary HTTP methods:
class Task(Resource):
    tasks = []
    def get(self, task_id):
        task = next((task for task in Task.tasks if task['id'] == task_id), None)
        if task is None:
            return {"error": "Task not found"}, 404
        return task
    def post(self):
        data = request.get_json()
        task = {"id": len(Task.tasks) + 1, "title": data["title"]}
        Task.tasks.append(task)
        return task, 201
    def put(self, task_id):
        data = request.get_json()
        task = next((task for task in Task.tasks if task['id'] == task_id), None)
        if task is None:
            return {"error": "Task not found"}, 404
        task.update({"title": data["title"]})
        return task
    def delete(self, task_id):
        task = next((task for task in Task.tasks if task['id'] == task_id), None)
        if task is None:
            return {"error": "Task not found"}, 404
        Task.tasks.remove(task)
        return {"result": "Task deleted"}
In this class, we’ve implemented the get, post, put, and delete methods to handle the respective HTTP methods for our Task resource. We’re also using a simple in-memory list called tasks to store our tasks.
Now that we have a Task resource, let’s add it to our API:
api.add_resource(Task, "/tasks/<int:task_id>")
This line maps the Task resource to the /tasks/<int:task_id> endpoint, where <int:task_id> is a dynamic URL parameter representing the task ID.
Finally, let’s add the entry point for our application:
if __name__ == "__main__":
    app.run(debug=True)
This will start the Flask development server when we run the script.
With our API implemented, let’s test the endpoints using curl:
POST: Create a new task
$ curl -X POST -H "Content-Type: application/json" -d '{"title": "First task"}' http://localhost:5000/tasks/1
```
GET: Retrieve a task by its ID
$ curl -X GET http://localhost:5000/tasks/1
```
PUT: Update a task
$ curl -X PUT -H "Content-Type: application/json" -d '{"title": "Updated task"}' http://localhost:5000/tasks/1
```
DELETE: Delete a task
$ curl -X DELETE http://localhost:5000/tasks/1
```
In this tutorial, we’ve built a simple RESTful API using Flask-RESTful in Python. Flask-RESTful makesit easy to create, retrieve, update, and delete resources by providing a convenient Resource class and allowing you to define HTTP methods as class methods.
While our example used an in-memory list to store tasks, you can easily replace it with a persistent data store, such as a database, to build a more robust RESTful API.
Flask-RESTful also provides additional features, such as request parsing, input validation, and custom error messages, which can be used to further improve your API. To learn more about these features and how to use them, check out the official Flask-RESTful documentation.