Cómo Crear una API RESTful en Python Usando Flask: Guía Completa

Una tarea común en el desarrollo web es crear una API REST para que distintas aplicaciones puedan interactuar con un servidor. En esta guía, aprenderás cómo crear una API REST simple utilizando Flask, una de las bibliotecas más populares para el desarrollo de aplicaciones web en Python.

Requisitos previos

Antes de comenzar, necesitas tener instalado:

  • Python 3.x
  • pip (gestor de paquetes de Python)

Paso 1: Configuración del entorno

  1. Primero, crea un nuevo directorio para tu proyecto:
bash
mkdir flask-api
cd flask-api
  1. Crea un entorno virtual:
bash
python -m venv venv
  1. Activa el entorno virtual:
  • En Windows:
bash
venvScriptsactivate
  • En macOS/Linux:
bash
source venv/bin/activate
  1. Instala las dependencias necesarias:
bash
pip install flask
pip install flask-cors

Paso 2: Crear la estructura básica

Crea un archivo app.py con el siguiente contenido básico:

python
from flask import Flask, request, jsonify
import uuid
from flask_cors import CORS

app = Flask(__name__)
# Habilitar CORS para todas las rutas
CORS(app)

# Lista de tareas (simulando una base de datos)
todos = []

@app.route('/')
def home():
  return jsonify({"message": "Bienvenido a la API de Tareas"})

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

Paso 3: Implementar los endpoints CRUD

Añade los siguientes endpoints a tu app.py:

python
# Crear una nueva tarea (CREATE)
@app.route('/todos', methods=['POST'])
def create_todo():
  data = request.get_json()
  
  if 'title' not in data:
      return jsonify({"error": "El título es requerido"}), 400
  
  new_todo = {
      "id": str(uuid.uuid4()),  # Generar un UUID único
      "title": data['title'],
      "completed": False
  }
  
  todos.append(new_todo)

  return jsonify(new_todo), 201

# Obtener todas las tareas (READ)
@app.route('/todos', methods=['GET'])
def get_todos():
  return jsonify(todos)

# Obtener una tarea específica (READ)
@app.route('/todos/<string:todo_id>', methods=['GET'])
def get_todo(todo_id):
  todo = next((todo for todo in todos if todo["id"] == todo_id), None)
  if todo is None:
      return jsonify({"error": "Tarea no encontrada"}), 404
  return jsonify(todo)

# Actualizar una tarea (UPDATE)
@app.route('/todos/<string:todo_id>', methods=['PUT'])
def update_todo(todo_id):
  data = request.get_json()
  todo = next((todo for todo in todos if todo["id"] == todo_id), None)
  
  if todo is None:
      return jsonify({"error": "Tarea no encontrada"}), 404
  
  todo['title'] = data.get('title', todo['title'])
  todo['completed'] = data.get('completed', todo['completed'])
  
  return jsonify(todo)

# Eliminar una tarea (DELETE)
@app.route('/todos/<string:todo_id>', methods=['DELETE'])
def delete_todo(todo_id):
  todo = next((todo for todo in todos if todo["id"] == todo_id), None)
  
  if todo is None:
      return jsonify({"error": "Tarea no encontrada"}), 404
  
  todos.remove(todo)
  return '', 204

Paso 4: Manejo de errores

Añade manejo básico de errores:

python
@app.errorhandler(400)
def bad_request(error):
  return jsonify({"error": "Solicitud incorrecta"}), 400

@app.errorhandler(404)
def not_found(error):
  return jsonify({"error": "Recurso no encontrado"}), 404

@app.errorhandler(500)
def internal_server_error(error):
  return jsonify({"error": "Error interno del servidor"}), 500

Paso 5: Ejecutar la aplicación

  1. Guarda todos los cambios en app.py

  2. Ejecuta la aplicación:

bash
python app.py

La API estará disponible en http://localhost:5000

Probando la API


Puedes probar la API usando curl o Postman. Aquí hay algunos ejemplos usando curl:

Crear una nueva tarea:

python
curl -X POST -H "Content-Type: application/json" -d '{"title":"Comprar leche"}' http://localhost:5000/todos

Obtener todas las tareas:

bash
curl http://localhost:5000/todos

Obtener una tarea específica:

bash
curl http://localhost:5000/todos/1

Actualizar una tarea:

bash
curl -X PUT -H "Content-Type: application/json" -d '{"completed":true}' http://localhost:5000/todos/1

Eliminar una tarea:

bash
curl -X DELETE http://localhost:5000/todos/1

Estructura de los endpoints

Método HTTPEndpointDescripción
GET/todosObtener todas las tareas
GET/todos/<id>\Obtener una tarea específica
POST/todosCrear una nueva tarea
PUT/todos/<id>\Actualizar una tarea existente
DELETE/todos/<id>\Eliminar una tarea
  Conclusión

Esta API implementa todas las operaciones CRUD y puede servir como base para proyectos más complejos.