Flask-RESTful is an extension for Flask that simplifies the process of building REST APIs. It provides additional tools for creating APIs with minimal boilerplate code while following REST principles. With Flask-RESTful, defining API resources, handling requests, and formatting responses become more structured and efficient.
Features of Flask-RESTful:
- Simplifies API Development – Provides a cleaner and more structured approach.
- Automatic Request Parsing – Built-in support for handling request arguments.
- Better Resource Management – Uses classes to define API resources.
- Response Formatting – Automatically formats responses in JSON.
- Integrated Error Handling – Provides built-in exception handling for common errors.
Installation and Setup
Create a project folder and then inside that folder create and activate a virtual environment to install Flask and other necessary modules in it. Use these commands to create and activate a new virtual environment:
python -m venv venv
.venv\Scripts\activate
And after that install Flask and Flask-RESTful extension using these command:
pip install flask
pip install flask-restful
How Flask-RESTful Works
Flask-RESTful simplifies API development by introducing a class-based approach. Instead of defining routes using @app.route(), Flask-RESTful allows us to define API resources as Python classes, where each HTTP method (GET, POST, PUT, DELETE) is represented by a class method.
Resource Class
- Resource is a special class provided by Flask-RESTful.
- When a class (like GFG, in the example below) inherits from Resource, it automatically gains the ability to handle HTTP methods (GET, POST, PUT, DELETE).
- We define these methods inside the class, and Flask-RESTful automatically maps them to the corresponding API requests.
Key concepts in Flask-RESTful:
- Resource Class – Each API resource is defined as a class that inherits from Resource.
- Methods for HTTP Requests – get(), post(), put(), and delete() methods handle different HTTP requests.
- Adding Resources to API – The add_resource() method links resource classes to specific URL endpoints.
Before we build a full-fledged API, let’s look at a basic example:
Python
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
# Defining a simple resource
class GFG(Resource):
def get(self):
return {"message": "Hello, Flask-RESTful!"}
# Adding resource to API
api.add_resource(GFG, '/')
if __name__ == '__main__':
app.run(debug=True)
Explanation:
- We create a GFG class that inherits from Resource.
- The get() method returns a JSON response when a GET request is made.
- The add_resource() method links the GFG resource to the '/' route.
Now if we run the app we can see the message:
Restful APIBuilding a REST API with Flask-RESTful
Now that we understand the basics, let's move on to building a complete REST API that manages a collection of books. Our API will allow users to:
- Get all books
- Get a specific book by ID
- Add a new book
- Update an existing book
- Delete a book
Here is the implementation:
Python
from flask import Flask, request
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
# Sample data
books = [
{"id": 1, "title": "Concept of Physics", "author": "H.C Verma"},
{"id": 2, "title": "Gunahon ka Devta", "author": "Dharamvir Bharti"},
{"id": 3, "title": "Problems in General Physics", "author": "I.E Irodov"}
]
# API Resource Class
class BookResource(Resource):
def get(self, book_id=None):
if book_id is None:
return books, 200 # Explicitly return status 200
book = next((book for book in books if book["id"] == book_id), None)
if book:
return book, 200 # Explicitly return 200 OK
return {"error": "Book not found"}, 404 # Return 404 only when not found
def post(self):
new_book = request.json
books.append(new_book)
return new_book, 201 # Created status
def put(self, book_id):
book = next((book for book in books if book["id"] == book_id), None)
if not book:
return {"error": "Book not found"}, 404 # Explicit 404
data = request.json
book.update(data)
return book, 200 # Return updated book with 200 OK
def delete(self, book_id):
global books
books = [book for book in books if book["id"] != book_id]
return {"message": "Book deleted"}, 200 # Explicitly return 200
# Adding Resources to API
api.add_resource(BookResource, '/books', '/books/<int:book_id>')
if __name__ == '__main__':
app.run(debug=True)
Explanation:
1. Flask-RESTful Setup
- Api(app): Initializes the REST API.
- api.add_resource(): Registers the resource class to specific endpoints.
2. Understanding API Methods:
- GET /books – Returns the complete list of books.
- GET /books/<book_id> – Retrieves details of a single book by ID.
- POST /books – Adds a new book to the list.
- PUT /books/<book_id> – Updates an existing book’s information.
- DELETE /books/<book_id> – Removes a book from the list
Running and Testing Application
Launch the Flask application using this command in termial:
python app.py
After the app is live on development server, open the Postman app to test the API Methods:
GET all Books:
Make a GET Request to URL- http://127.0.0.1:5000/books:
GET MethodGET a specific book:
Make a GET Request to URL- http://127.0.0.1:5000/books/id , replace the id with the desired book id for example, to get the book with id=3, URL should be - http://127.0.0.1:5000/books/3.
GET Method for a specific bookPOST a New Book
Make a POST Request to URL- http://127.0.0.1:5000/books, and provide the book data in JSON format under the raw tab:
POST MethodDELETE a Book
To delete a book, a DELETE request with the book id should be made to the URL- http://127.0.0.1:5000/books/id (replace the id with the specific book id).
DELETE MethodSimilary we can test all the different methods using Postman app, below is a table that summarizes how to make different request with their specific configurations.
Action | Method | URL | Body (JSON) | Response |
---|
Get all books | GET | /books | None | List of books |
---|
Get a book by ID | GET | /books/1 | None | Book details or 404 |
---|
Add a new book | POST | /books | { "id": 4, "title": "New", "author": "X" } | New book data |
---|
Update a book | PUT | /books/2 | { "title": "Updated" } | Updated book data or 404 |
---|
Similar Reads
Extensions in Flask
Flask is a popular web framework for creating web apps in Python is called Flask. It is renowned for its flexibility and simplicity, which enables developers to easily design sophisticated applications. Moreover, Flask features a capability known as "extensions," which are outside packages that incr
6 min read
Flask Creating Rest APIs
A REST API (Representational State Transfer API) is a way for applications to communicate over the web using standard HTTP methods. It allows clients (such as web or mobile apps) to interact with a server by sending requests and receiving responses, typically in JSON format.REST APIs follow a statel
4 min read
Building RESTful APIs with FastAPI
FastAPI is a Python web framework that makes it easy to build APIs quickly and efficiently. There is Another famous framework for doing the same is Flask, which is also Python-based. In this article, we will focus on creating a RESTful API using FastAPI. In this article, we will learn how to create
5 min read
FastAPI - Rest Architecture
FastAPI is a modern web framework for building APIs with Python. When developing a RESTful API with FastAPI, you can follow a REST architectural style, which stands for Representational State Transfer. In this article, we will learn about the FastAPI-Rest Architecture. Before going let's understand
9 min read
Flask - WTF
Flask-WTF is a Flask extension that integrates the WTForms library, making form creation and validation easier in Flask applications. It provides a structured way to build forms, handle validation, and render them in HTML. In this article, we'll explore how Flask-WTF works by building a Signup form.
5 min read
Passing URL Arguments in Flask
In this article, we will cover how to Pass URL Arguments in Flask using Python. URL converters in Flask are mentioned in angular brackets (<>). These unique converters are designed to let us generate extremely dynamic URLs, where a part of the URL is regarded as a variable. For that we have cr
4 min read
Flask Tutorial
Flask is a lightweight and powerful web framework for Python. Itâs often called a "micro-framework" because it provides the essentials for web development without unnecessary complexity. Unlike Django, which comes with built-in features like authentication and an admin panel, Flask keeps things mini
8 min read
Using JWT for user authentication in Flask
JWT (JSON Web Token) is a compact, secure, and self-contained token used for securely transmitting information between parties. It is often used for authentication and authorization in web applications. A JWT consists of three parts:Header - Contains metadata (e.g., algorithm used for signing).Paylo
6 min read
Flask - Role Based Access Control
Role-Based Access Control (RBAC) is a security mechanism that restricts user access based on their roles within an application. Instead of assigning permissions to individual users, RBAC groups users into roles and each role has specific permissions.For example, in a Flask app, we might have roles l
9 min read
Generating dynamic URLs in Flask
Prerequisites: Basics of Flask When creating an application, it's quite cumbersome to hard-code each URL. A better way to resolve this problem is through building Dynamic URLs. Â Let us briefly understand the meaning of a few common terms first. Dynamic Routing: It is the process of getting dynamic d
3 min read