En el mundo del desarrollo web, las APIs (Interfaces de Programación de Aplicaciones) son fundamentales para permitir la comunicación y el intercambio de datos entre diferentes sistemas y aplicaciones. Python, con su sintaxis clara y su gran cantidad de bibliotecas, es una excelente opción para crear APIs de manera rápida y eficiente. En este artículo, exploraremos cómo crear APIs en Python utilizando Flask, un microframework web ligero y flexible. Aprenderemos desde los conceptos básicos de una API hasta la implementación de una API funcional con rutas y métodos específicos.
Conceptos Básicos de una API
Una API (Interfaz de Programación de Aplicaciones) es un conjunto de reglas y especificaciones que permiten que diferentes aplicaciones se comuniquen entre sí. Actúa como un intermediario, facilitando la interacción entre sistemas, servicios o componentes de software sin necesidad de que conozcan los detalles internos de implementación del otro.
Tipos de APIs:
- APIs REST (Representational State Transfer): Son las más comunes en el desarrollo web moderno. Se basan en principios de arquitectura RESTful, utilizando métodos HTTP (GET, POST, PUT, DELETE) para realizar operaciones sobre recursos.
- APIs SOAP (Simple Object Access Protocol): Utilizan un protocolo más estricto y formal basado en XML para el intercambio de mensajes.
- APIs GraphQL: Permiten a los clientes especificar exactamente qué datos necesitan, evitando la sobre-extracción de información.
Principios Clave de REST:
- Cliente-Servidor: Separación clara entre la interfaz de usuario (cliente) y el almacenamiento de datos (servidor).
- Sin estado (Stateless): Cada solicitud del cliente al servidor debe contener toda la información necesaria para ser procesada, sin que el servidor guarde información de sesión.
- Cacheable: Las respuestas del servidor deben indicar si pueden ser cacheadas por el cliente para mejorar el rendimiento.
- Interfaz Uniforme: Uso consistente de métodos HTTP, recursos identificados por URIs, y representación de datos en formatos estándar como JSON o XML.
Métodos HTTP Comunes:
- GET: Obtiene un recurso.
- POST: Crea un nuevo recurso.
- PUT: Actualiza un recurso existente completamente.
- PATCH: Actualiza parcialmente un recurso existente.
- DELETE: Elimina un recurso.
Instalación y Configuración de Flask
Antes de comenzar a construir nuestra API, necesitamos instalar Flask y configurar nuestro entorno de desarrollo.
Instalación de Flask:
Puedes instalar Flask utilizando pip, el gestor de paquetes de Python:
pip install Flask
Entorno Virtual (Opcional pero Recomendado):
Es recomendable crear un entorno virtual para aislar las dependencias de tu proyecto. Puedes hacerlo con el siguiente comando:
python -m venv venv
# Activar el entorno virtual (Windows)
venv\Scripts\activate
# Activar el entorno virtual (macOS/Linux)
source venv/bin/activate
Estructura del Proyecto:
Una estructura de proyecto básica podría ser la siguiente:
my_api/
├── venv/ # Entorno virtual (opcional)
├── app.py # Archivo principal de la API
└── README.md # Documentación del proyecto
Archivo Principal (app.py):
Aquí tienes un ejemplo básico de un archivo app.py
:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return '¡Hola, Mundo!'
if __name__ == '__main__':
app.run(debug=True)
Explicación del Código:
- Importamos la clase
Flask
desde el móduloflask
. - Creamos una instancia de la aplicación Flask:
app = Flask(__name__)
. - Definimos una ruta con el decorador
@app.route('/')
, que asocia la funciónhello_world
a la ruta raíz (‘/’). - La función
hello_world
devuelve un mensaje que se mostrará en el navegador. - Finalmente, ejecutamos la aplicación en modo de depuración con
app.run(debug=True)
. El modo de depuración permite que la aplicación se reinicie automáticamente cuando se detectan cambios en el código.
Ejecutar la Aplicación:
Para ejecutar la aplicación, guarda el archivo app.py
y ejecuta el siguiente comando en tu terminal:
python app.py
Luego, abre tu navegador y visita http://127.0.0.1:5000/
(o la dirección que te indique la terminal) para ver el mensaje «¡Hola, Mundo!»
Creación de Rutas y Métodos
Las rutas y los métodos HTTP son la base de cualquier API RESTful. Definen cómo los clientes interactúan con los recursos de tu API.
Definición de Rutas:
En Flask, las rutas se definen utilizando el decorador @app.route()
. Este decorador asocia una función a una URL específica.
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/users', methods=['GET'])
def get_users():
users = [
{'id': 1, 'name': 'Juan Perez'},
{'id': 2, 'name': 'Maria Rodriguez'}
]
return jsonify(users)
En este ejemplo, hemos definido una ruta /users
que responde al método GET
. La función get_users
devuelve una lista de usuarios en formato JSON utilizando la función jsonify()
de Flask.
Manejo de Diferentes Métodos HTTP:
Puedes definir diferentes funciones para manejar diferentes métodos HTTP en la misma ruta:
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
# Lógica para crear un nuevo usuario en la base de datos
return jsonify({'message': 'Usuario creado con éxito'}), 201
En este caso, la función create_user
se ejecuta cuando se recibe una solicitud POST
en la ruta /users
. Utilizamos request.get_json()
para obtener los datos enviados en el cuerpo de la solicitud en formato JSON. El código de estado 201
indica que el recurso fue creado con éxito.
Parámetros en la URL:
Puedes definir parámetros en la URL utilizando <nombre_parametro>
en la definición de la ruta:
@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
# Lógica para obtener un usuario por su ID
user = {'id': user_id, 'name': f'Usuario {user_id}'}
return jsonify(user)
En este ejemplo, <int:user_id>
define un parámetro llamado user_id
que debe ser un entero. Flask automáticamente convierte el valor del parámetro a un entero y lo pasa a la función get_user
.
Códigos de Estado HTTP:
Es importante devolver códigos de estado HTTP apropiados para indicar el resultado de la operación:
- 200 OK: Operación exitosa.
- 201 Created: Recurso creado con éxito.
- 204 No Content: Operación exitosa, pero no hay contenido que devolver.
- 400 Bad Request: Solicitud incorrecta.
- 401 Unauthorized: No autorizado.
- 403 Forbidden: Prohibido.
- 404 Not Found: Recurso no encontrado.
- 500 Internal Server Error: Error interno del servidor.
Ejemplo de API Funcional
Vamos a crear una API funcional que permita gestionar una lista de tareas (To-Do). Esta API tendrá las siguientes funcionalidades:
- Obtener todas las tareas (GET /todos)
- Obtener una tarea por su ID (GET /todos/<int:todo_id>)
- Crear una nueva tarea (POST /todos)
- Actualizar una tarea existente (PUT /todos/<int:todo_id>)
- Eliminar una tarea (DELETE /todos/<int:todo_id>)
Código Completo:
from flask import Flask, jsonify, request
app = Flask(__name__)
todos = [
{'id': 1, 'title': 'Aprender Flask', 'completed': False},
{'id': 2, 'title': 'Construir una API', 'completed': False}
]
@app.route('/todos', methods=['GET'])
def get_todos():
return jsonify(todos)
@app.route('/todos/<int:todo_id>', methods=['GET'])
def get_todo(todo_id):
todo = next((todo for todo in todos if todo['id'] == todo_id), None)
if todo:
return jsonify(todo)
return jsonify({'message': 'Tarea no encontrada'}), 404
@app.route('/todos', methods=['POST'])
def create_todo():
data = request.get_json()
new_todo = {
'id': len(todos) + 1,
'title': data['title'],
'completed': False
}
todos.append(new_todo)
return jsonify(new_todo), 201
@app.route('/todos/<int:todo_id>', methods=['PUT'])
def update_todo(todo_id):
todo = next((todo for todo in todos if todo['id'] == todo_id), None)
if todo:
data = request.get_json()
todo['title'] = data.get('title', todo['title'])
todo['completed'] = data.get('completed', todo['completed'])
return jsonify(todo)
return jsonify({'message': 'Tarea no encontrada'}), 404
@app.route('/todos/<int:todo_id>', methods=['DELETE'])
def delete_todo(todo_id):
global todos
todos = [todo for todo in todos if todo['id'] != todo_id]
return jsonify({'message': 'Tarea eliminada con éxito'}), 200
if __name__ == '__main__':
app.run(debug=True)
Explicación del Código:
- Inicializamos una lista de tareas llamada
todos
. - Definimos rutas para cada una de las funcionalidades mencionadas anteriormente.
- Utilizamos
next()
con una expresión generadora para buscar una tarea por su ID. - Utilizamos
request.get_json()
para obtener los datos enviados en el cuerpo de la solicitud. - Devolvemos códigos de estado HTTP apropiados para cada operación.
Probar la API:
Puedes probar esta API utilizando herramientas como Postman o curl. Aquí tienes algunos ejemplos:
- Obtener todas las tareas:
curl http://127.0.0.1:5000/todos
- Crear una nueva tarea:
curl -X POST -H "Content-Type: application/json" -d '{"title": "Hacer la compra"}' http://127.0.0.1:5000/todos
En este artículo, hemos aprendido cómo crear APIs en Python utilizando Flask. Desde los conceptos básicos de una API hasta la implementación de una API funcional, hemos cubierto los aspectos clave para construir APIs RESTful de manera eficiente. Flask, con su simplicidad y flexibilidad, es una excelente opción para desarrollar APIs en Python, especialmente para proyectos pequeños y medianos. Con el conocimiento adquirido en este artículo, puedes empezar a construir tus propias APIs y a integrar tus aplicaciones con otros sistemas.