En este módulo, aprenderemos sobre las APIs RESTful y cómo implementarlas utilizando Flask. Las APIs RESTful son una forma popular de construir servicios web que permiten la comunicación entre diferentes sistemas a través de HTTP. REST (Representational State Transfer) es un estilo arquitectónico que utiliza métodos HTTP estándar y se basa en recursos identificados por URLs.
Conceptos Clave
-
REST (Representational State Transfer):
- Es un estilo arquitectónico para diseñar servicios web.
- Utiliza métodos HTTP estándar como GET, POST, PUT, DELETE.
- Los recursos se identifican mediante URLs.
-
Recursos:
- Son entidades que se pueden acceder y manipular a través de la API.
- Cada recurso tiene una URL única.
-
Métodos HTTP:
- GET: Recupera información de un recurso.
- POST: Crea un nuevo recurso.
- PUT: Actualiza un recurso existente.
- DELETE: Elimina un recurso.
-
JSON (JavaScript Object Notation):
- Es un formato ligero de intercambio de datos.
- Es fácil de leer y escribir para los humanos y fácil de parsear y generar para las máquinas.
Configuración Inicial
Antes de comenzar, asegúrate de tener Flask instalado en tu entorno de desarrollo. Si no lo tienes, puedes instalarlo usando pip:
Creando una API RESTful Básica
Vamos a crear una API RESTful básica que maneje un recurso llamado books
. Esta API permitirá realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) sobre los libros.
Paso 1: Configuración del Proyecto
Crea un nuevo directorio para tu proyecto y dentro de él, crea un archivo llamado app.py
.
Paso 2: Configuración de Flask
En app.py
, configura una aplicación Flask básica:
from flask import Flask, jsonify, request app = Flask(__name__) # Datos de ejemplo books = [ {'id': 1, 'title': '1984', 'author': 'George Orwell'}, {'id': 2, 'title': 'To Kill a Mockingbird', 'author': 'Harper Lee'} ] @app.route('/') def home(): return "Welcome to the Book API!" if __name__ == '__main__': app.run(debug=True)
Paso 3: Definiendo Endpoints RESTful
Obtener Todos los Libros (GET)
Añade un endpoint para obtener todos los libros:
Obtener un Libro por ID (GET)
Añade un endpoint para obtener un libro específico por su ID:
@app.route('/books/<int:book_id>', methods=['GET']) def get_book(book_id): book = next((book for book in books if book['id'] == book_id), None) if book is not None: return jsonify(book) else: return jsonify({'error': 'Book not found'}), 404
Crear un Nuevo Libro (POST)
Añade un endpoint para crear un nuevo libro:
@app.route('/books', methods=['POST']) def create_book(): new_book = request.get_json() new_book['id'] = len(books) + 1 books.append(new_book) return jsonify(new_book), 201
Actualizar un Libro (PUT)
Añade un endpoint para actualizar un libro existente:
@app.route('/books/<int:book_id>', methods=['PUT']) def update_book(book_id): book = next((book for book in books if book['id'] == book_id), None) if book is not None: updated_data = request.get_json() book.update(updated_data) return jsonify(book) else: return jsonify({'error': 'Book not found'}), 404
Eliminar un Libro (DELETE)
Añade un endpoint para eliminar un libro:
@app.route('/books/<int:book_id>', methods=['DELETE']) def delete_book(book_id): global books books = [book for book in books if book['id'] != book_id] return '', 204
Código Completo
Aquí está el código completo de app.py
:
from flask import Flask, jsonify, request app = Flask(__name__) # Datos de ejemplo books = [ {'id': 1, 'title': '1984', 'author': 'George Orwell'}, {'id': 2, 'title': 'To Kill a Mockingbird', 'author': 'Harper Lee'} ] @app.route('/') def home(): return "Welcome to the Book API!" @app.route('/books', methods=['GET']) def get_books(): return jsonify(books) @app.route('/books/<int:book_id>', methods=['GET']) def get_book(book_id): book = next((book for book in books if book['id'] == book_id), None) if book is not None: return jsonify(book) else: return jsonify({'error': 'Book not found'}), 404 @app.route('/books', methods=['POST']) def create_book(): new_book = request.get_json() new_book['id'] = len(books) + 1 books.append(new_book) return jsonify(new_book), 201 @app.route('/books/<int:book_id>', methods=['PUT']) def update_book(book_id): book = next((book for book in books if book['id'] == book_id), None) if book is not None: updated_data = request.get_json() book.update(updated_data) return jsonify(book) else: return jsonify({'error': 'Book not found'}), 404 @app.route('/books/<int:book_id>', methods=['DELETE']) def delete_book(book_id): global books books = [book for book in books if book['id'] != book_id] return '', 204 if __name__ == '__main__': app.run(debug=True)
Ejercicios Prácticos
-
Añadir un Campo Nuevo:
- Añade un campo
genre
a cada libro y actualiza los endpoints para manejar este nuevo campo.
- Añade un campo
-
Manejo de Errores:
- Mejora el manejo de errores para los endpoints de actualización y eliminación, asegurándote de que se devuelvan mensajes de error claros cuando un libro no se encuentra.
-
Autenticación Básica:
- Implementa una autenticación básica para proteger los endpoints de creación, actualización y eliminación de libros.
Conclusión
En esta lección, hemos aprendido los conceptos básicos de las APIs RESTful y cómo implementarlas utilizando Flask. Hemos creado una API básica que permite realizar operaciones CRUD sobre un recurso de libros. En las próximas lecciones, profundizaremos en temas más avanzados como la autenticación y la gestión de datos JSON.
Curso de Desarrollo Web con Flask
Módulo 1: Introducción a Flask
- ¿Qué es Flask?
- Configuración de tu Entorno de Desarrollo
- Creando tu Primera Aplicación Flask
- Entendiendo la Estructura de una Aplicación Flask
Módulo 2: Conceptos Básicos de Flask
- Enrutamiento y Mapeo de URLs
- Manejo de Métodos HTTP
- Renderizando Plantillas con Jinja2
- Trabajando con Archivos Estáticos
Módulo 3: Formularios y Entrada de Usuario
Módulo 4: Integración de Bases de Datos
- Introducción a Flask-SQLAlchemy
- Definiendo Modelos
- Realizando Operaciones CRUD
- Migraciones de Base de Datos con Flask-Migrate
Módulo 5: Autenticación de Usuarios
- Registro de Usuarios
- Inicio y Cierre de Sesión de Usuarios
- Hashing de Contraseñas
- Gestión de Sesiones de Usuario
Módulo 6: Conceptos Avanzados de Flask
- Blueprints para Aplicaciones Grandes
- Manejo de Errores
- Páginas de Error Personalizadas
- Registro y Depuración
Módulo 7: APIs RESTful con Flask
- Introducción a las APIs RESTful
- Creación de Endpoints RESTful
- Manejo de Datos JSON
- Autenticación para APIs
Módulo 8: Despliegue y Producción
- Configuración de Flask para Producción
- Despliegue en Heroku
- Despliegue en AWS
- Monitoreo y Optimización del Rendimiento
Módulo 9: Pruebas y Mejores Prácticas
- Pruebas Unitarias con Flask
- Pruebas de Integración
- Cobertura de Pruebas
- Mejores Prácticas para el Desarrollo con Flask