API RESTful desarrollada con Python y Flask para la gestión de inventario de productos. Este proyecto demuestra habilidades en desarrollo backend, arquitectura MVC, programación orientada a objetos y bases de datos SQL.
- Características
- Tecnologías utilizadas
- Requisitos previos
- Instalación
- Estructura del proyecto
- Endpoints
- Ejemplos de uso
- Arquitectura
- Autor
CRUD completo - Crear, leer, actualizar y eliminar productos
API RESTful - Endpoints bien definidos con métodos HTTP (GET, POST, PUT, DELETE)
Respuestas en JSON - Formato estándar de la industria
Manejo de errores robusto - Mensajes claros y códigos de estado HTTP apropiados
Validación de datos - Validación de campos requeridos y tipos de datos
CORS habilitado - Permite consumir la API desde cualquier origen
Código limpio y documentado - Comentarios y docstrings en todo el código
Patrón MVC - Separación clara entre modelo, vista y controlador
POO implementado - Uso de clases y objetos para mejor organización
| Tecnología | Versión | Propósito |
|---|---|---|
| Python | 3.9+ | Lenguaje de programación principal |
| Flask | 2.3.3 | Framework web para crear APIs |
| Flask-CORS | 4.0.0 | Manejo de CORS |
| MySQL | 5.7+ | Base de datos relacional |
| mysql-connector-python | 8.0.33 | Conector para conectar Python con MySQL |
| XAMPP | - | Servidor local (Apache + MySQL + PHP) |
Antes de empezar, asegúrate de tener instalado:
- Python 3.9 o superior - Descargar
- pip - Gestor de paquetes de Python (viene con Python)
- XAMPP - Descargar - Necesitas MySQL activo
- Git - Descargar - Para control de versiones
- Postman o cURL - Para probar los endpoints (opcional pero recomendado)
git clone https://github.com/tu-usuario/inventory-api-python.git
cd inventory-api-python# Windows
python -m venv venv
venv\Scripts\activate
# macOS/Linux
python3 -m venv venv
source venv/bin/activatepip install -r requirements.txt- Abre XAMPP Control Panel
- Inicia Apache (opcional si no necesitas servidor web)
- Inicia MySQL
- Verifica que MySQL esté corriendo en
localhost:3306
python app.pyDeberías ver:
Inicializando Inventory API Python...
Creando estructura de base de datos...
Base de datos lista
Iniciando servidor Flask...
URL: http://localhost:5000
Documentación: http://localhost:5000/api/salud
Presiona CTRL+C para detener el servidor
inventory-api-python/
│
├── config/
│ ├── __init__.py
│ └── database.py # Configuración y conexión a BD
│
├── models/
│ ├── __init__.py
│ └── productModels.py # Modelo de datos (Producto)
│
├── controllers/
│ ├── __init__.py
│ └── productControllers.py # Lógica de negocio
│
├── app.py # Punto de entrada (Rutas/Endpoints)
├── requirements.txt # Dependencias del proyecto
├── .gitignore # Archivos a ignorar en Git
└── README.md # Este archivo
- config/ - Configuraciones de la aplicación (conexión a BD)
- models/ - Modelos de datos (clases que representan entidades)
- controllers/ - Lógica de negocio y procesamiento de datos
- app.py - Rutas/endpoints y punto de entrada de la aplicación
http://localhost:5000/api
GET /productosRespuesta exitosa (200):
{
"éxito": true,
"cantidad": 2,
"datos": [
{
"id_producto": 1,
"nombre": "Laptop",
"descripcion": "Laptop HP",
"precio": 800.0,
"cantidad": 5,
"fecha_creacion": "2024-01-15 10:30:00",
"fecha_actualizacion": "2024-01-15 10:30:00"
},
{
"id_producto": 2,
"nombre": "Mouse",
"descripcion": "Mouse inalámbrico",
"precio": 25.0,
"cantidad": 50,
"fecha_creacion": "2024-01-15 11:00:00",
"fecha_actualizacion": "2024-01-15 11:00:00"
}
]
}GET /productos/{id}Ejemplo:
GET /productos/1
Respuesta exitosa (200):
{
"éxito": true,
"datos": {
"id_producto": 1,
"nombre": "Laptop",
"descripcion": "Laptop HP",
"precio": 800.0,
"cantidad": 5,
"fecha_creacion": "2024-01-15 10:30:00",
"fecha_actualizacion": "2024-01-15 10:30:00"
}
}Error (404):
{
"éxito": false,
"error": "Producto no encontrado"
}POST /productos
Content-Type: application/jsonCuerpo de la solicitud:
{
"nombre": "Teclado",
"descripcion": "Teclado mecánico RGB",
"precio": 150.0,
"cantidad": 20
}Respuesta exitosa (201):
{
"éxito": true,
"mensaje": "Producto creado exitosamente",
"id": 3,
"datos": {
"id_producto": 3,
"nombre": "Teclado",
"descripcion": "Teclado mecánico RGB",
"precio": 150.0,
"cantidad": 20,
"fecha_creacion": null,
"fecha_actualizacion": null
}
}Error (400):
{
"éxito": false,
"error": "El nombre es requerido"
}PUT /productos/{id}
Content-Type: application/jsonEjemplo:
PUT /productos/1
Cuerpo de la solicitud (campos opcionales):
{
"nombre": "Laptop Dell",
"precio": 900.0,
"cantidad": 10
}Respuesta exitosa (200):
{
"éxito": true,
"mensaje": "Producto actualizado exitosamente",
"id": 1
}DELETE /productos/{id}Ejemplo:
DELETE /productos/1
Respuesta exitosa (200):
{
"éxito": true,
"mensaje": "Producto eliminado exitosamente"
}GET /saludRespuesta (200):
{
"éxito": true,
"mensaje": "API funcionando correctamente",
"versión": "1.0.0"
}# GET - Obtener todos los productos
curl http://localhost:5000/api/productos
# GET - Obtener producto por ID
curl http://localhost:5000/api/productos/1
# POST - Crear producto
curl -X POST http://localhost:5000/api/productos \
-H "Content-Type: application/json" \
-d '{
"nombre": "Monitor",
"descripcion": "Monitor 27 pulgadas",
"precio": 300,
"cantidad": 15
}'
# PUT - Actualizar producto
curl -X PUT http://localhost:5000/api/productos/1 \
-H "Content-Type: application/json" \
-d '{
"precio": 350,
"cantidad": 12
}'
# DELETE - Eliminar producto
curl -X DELETE http://localhost:5000/api/productos/1import requests
BASE_URL = "http://localhost:5000/api"
# GET - Obtener todos los productos
response = requests.get(f"{BASE_URL}/productos")
print(response.json())
# POST - Crear producto
datos = {
"nombre": "Webcam",
"descripcion": "Webcam 1080p",
"precio": 80,
"cantidad": 25
}
response = requests.post(f"{BASE_URL}/productos", json=datos)
print(response.json())
# PUT - Actualizar
datos_actualizar = {"precio": 90}
response = requests.put(f"{BASE_URL}/productos/1", json=datos_actualizar)
print(response.json())
# DELETE - Eliminar
response = requests.delete(f"{BASE_URL}/productos/1")
print(response.json())El proyecto está estructurado bajo el patrón Model-View-Controller:
-
Model (Modelo):
models/productModels.py- Define la claseProductoconfig/database.py- Maneja conexiones a la base de datos
-
View (Vista):
app.py- Define los endpoints/rutas que retornan respuestas JSON
-
Controller (Controlador):
controllers/productControllers.py- Contiene la lógica de negocio- Procesa datos, valida, y hace consultas a la BD
Se utilizan clases para:
- Producto: Representa la entidad producto con métodos para validar y convertir a JSON
- Database: Maneja todas las conexiones y operaciones de BD
- ProductoController: Encapsula la lógica de negocio
Consideraciones de seguridad implementadas:
✅ Validación de datos - Los datos se validan antes de guardar
✅ Consultas parametrizadas - Previene inyección SQL
✅ Manejo de errores - No expone detalles internos
✅ CORS configurado - Control de acceso
- Autenticación y autorización (JWT)
- Paginación en listados
- Búsqueda y filtrado de productos
- Logging de operaciones
- Tests unitarios
- Documentación automática (Swagger/OpenAPI)
- Caché con Redis
- Rate limiting
Este proyecto está bajo la licencia MIT.
Alexis Diaz
Desarrollador Full Stack | Portafolio de Evidencia
- GitHub: maniadiaz
- LinkedIn: Alexis Diaz
Las contribuciones son bienvenidas. Para cambios importantes:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commits con mensajes claros (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Si tienes preguntas o encuentras problemas:
- Verifica que MySQL en XAMPP está corriendo
- Revisa que Python 3.9+ está instalado
- Abre un Issue en el repositorio
Hecho con ❤️ en Python