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

En el desarrollo web, una tarea común es la creación de una API REST, que permite la comunicación entre distintas aplicaciones y un servidor. En esta guía, aprenderás a desarrollar una API REST simple utilizando Flask, una de las bibliotecas más populares para la creación 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.