How to create a RESTful API in Python with Flask

How to Create a RESTful API in Python with Flask

Creating a RESTful API is a common task for developers, especially when building web applications. Flask, a lightweight web framework for Python, makes this process simple and efficient. In this article, we will explore how to create a RESTful API using Flask, provide actionable insights, and present clear code examples to enhance your understanding.

What is a RESTful API?

A RESTful API (Representational State Transfer) is a set of rules for building web services that allow different systems to communicate over the internet. It uses standard HTTP methods like GET, POST, PUT, and DELETE to perform operations on resources, which are typically represented in JSON format.

Key Features of RESTful APIs:

  • Stateless: Each request from a client contains all the information the server needs to fulfill that request.
  • Resource-Based: Everything in the API is considered a resource and is identified by a unique URL.
  • Use of HTTP Methods: Different HTTP methods are used to perform operations on resources, making it intuitive and easy to understand.

Why Use Flask for Building APIs?

Flask is popular among developers for several reasons:

  • Lightweight and Flexible: Flask provides just the essentials, allowing you to build applications quickly without unnecessary overhead.
  • Extensible: You can enhance Flask with various plugins and extensions to add functionality as needed.
  • Easy to Learn: With a straightforward syntax, Flask is beginner-friendly and has comprehensive documentation.

Setting Up Your Flask Environment

Before we start coding, ensure you have Python and Flask installed. If you don’t have Flask installed yet, you can do so using pip:

pip install Flask

Step-by-Step Guide to Creating a RESTful API with Flask

Step 1: Create the Project Structure

First, create a new directory for your project. Within that directory, create a new Python file (e.g., app.py) and a folder for your data (optional, for storing any JSON files).

mkdir flask_api
cd flask_api
touch app.py

Step 2: Initialize Flask Application

In app.py, start by importing Flask and creating an instance of the Flask class:

from flask import Flask, jsonify, request

app = Flask(__name__)

Step 3: Create a Sample Data Source

For demonstration, let’s create a simple in-memory data source. You can later replace this with a database.

# Sample data
tasks = [
    {'id': 1, 'title': 'Learn Flask', 'done': False},
    {'id': 2, 'title': 'Build REST API', 'done': False}
]

Step 4: Define API Endpoints

Now, let’s define some endpoints for our API.

GET All Tasks

This endpoint retrieves all tasks.

@app.route('/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

GET Task by ID

This endpoint retrieves a task by its ID.

@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = next((task for task in tasks if task['id'] == task_id), None)
    return jsonify({'task': task}) if task else jsonify({'error': 'Task not found'}), 404

POST a New Task

This endpoint allows you to create a new task.

@app.route('/tasks', methods=['POST'])
def create_task():
    new_task = request.get_json()
    new_task['id'] = len(tasks) + 1
    tasks.append(new_task)
    return jsonify(new_task), 201

PUT to Update a Task

This endpoint updates an existing task.

@app.route('/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):
    task = next((task for task in tasks if task['id'] == task_id), None)
    if task is None:
        return jsonify({'error': 'Task not found'}), 404

    updated_data = request.get_json()
    task.update(updated_data)
    return jsonify(task)

DELETE a Task

This endpoint deletes a task by its ID.

@app.route('/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
    global tasks
    tasks = [task for task in tasks if task['id'] != task_id]
    return jsonify({'result': 'Task deleted'})

Step 5: Run the Application

Finally, add the code to run the Flask application:

if __name__ == '__main__':
    app.run(debug=True)

Full Code Example

Here’s the complete code for your Flask RESTful API:

from flask import Flask, jsonify, request

app = Flask(__name__)

tasks = [
    {'id': 1, 'title': 'Learn Flask', 'done': False},
    {'id': 2, 'title': 'Build REST API', 'done': False}
]

@app.route('/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = next((task for task in tasks if task['id'] == task_id), None)
    return jsonify({'task': task}) if task else jsonify({'error': 'Task not found'}), 404

@app.route('/tasks', methods=['POST'])
def create_task():
    new_task = request.get_json()
    new_task['id'] = len(tasks) + 1
    tasks.append(new_task)
    return jsonify(new_task), 201

@app.route('/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):
    task = next((task for task in tasks if task['id'] == task_id), None)
    if task is None:
        return jsonify({'error': 'Task not found'}), 404

    updated_data = request.get_json()
    task.update(updated_data)
    return jsonify(task)

@app.route('/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
    global tasks
    tasks = [task for task in tasks if task['id'] != task_id]
    return jsonify({'result': 'Task deleted'})

if __name__ == '__main__':
    app.run(debug=True)

Conclusion

Creating a RESTful API in Python using Flask is a straightforward process that opens up numerous possibilities for web applications. By following the steps outlined in this article, you can build your own API, customize it, and extend its functionality. Remember to consider best practices such as error handling and input validation to ensure a robust API. Happy coding!

SR
Syed
Rizwan

About the Author

Syed Rizwan is a Machine Learning Engineer with 5 years of experience in AI, IoT, and Industrial Automation.