Un servidor Flask para almacenamiento y procesamiento de documentos PDF con arquitectura hexagonal.
Este proyecto implementa un servidor de almacenamiento local que permite:
- Recibir archivos PDF a través de una API REST
- Almacenar los archivos de forma segura en el sistema local
- Procesar y deserializar el contenido de los PDFs
- Retornar información extraída de los documentos
El proyecto sigue los principios de Arquitectura Hexagonal (Clean Architecture):
Storage-Server-Python/
├── Application/ # Capa de aplicación - Casos de uso
│ └── Services/
│ └── save_pdf_service.py
├── Domain/ # Capa de dominio - Interfaces y reglas de negocio
│ └── Interfaces/
│ ├── error_logger_interface.py
│ ├── event_logger_interface.py
│ ├── pdf_deserialize_interface.py
│ ├── pdf_saver_interface.py
│ ├── request_logger_interface.py
│ └── save_pdf_service_interface.py
├── Infraestructure/ # Capa de infraestructura - Implementaciones técnicas
│ └── PDFs/
│ ├── pdf_deserialize.py
│ └── pdf_saver.py
├── Presentation/ # Capa de presentación - Controladores web
│ └── controller.py
├── Data_temp_uploads/ # Directorio para archivos subidos (ignorado por git)
├── venv/ # Entorno virtual Python (ignorado por git)
├── main.py # Punto de entrada de la aplicación
├── requirements.txt # Dependencias del proyecto
├── start-app.bat # Script Batch para iniciar la app
└── stop-app.bat # Script Batch para detener la app
- Python 3.8 o superior
- pip (gestor de paquetes de Python)
- Git
-
Clonar el repositorio:
git clone https://github.com/Proyecto-Info-Aplicada/Local-storage.git cd Local-storage -
Crear entorno virtual:
python -m venv venv
-
Activar entorno virtual:
Windows PowerShell:
venv\Scripts\Activate.ps1
Windows CMD:
venv\Scripts\activate.bat
-
Instalar dependencias:
pip install -r requirements.txt
Opción 1: Usar scripts automatizados (Recomendado)
PowerShell:
.\start-app.ps1CMD:
start-app.batOpción 2: Comando manual
# Asegúrate de tener activado el entorno virtual
venv\Scripts\python.exe main.pyPowerShell:
.\stop-app.ps1CMD:
stop-app.batManual:
- Presiona
Ctrl + Cen la terminal donde está ejecutándose el servidor
El servidor se ejecuta por defecto en http://127.0.0.1:5000
- URL:
/receive-pdf - Método:
POST - Content-Type:
multipart/form-data - Parámetro:
pdf(archivo PDF)
Ejemplo con curl:
curl -X POST -F "pdf=@documento.pdf" http://127.0.0.1:5000/receive-pdfRespuesta exitosa (201):
{
"status": "success",
"message": "Documento procesado exitosamente.",
"data_extracted": {
"success": true,
"content": "Contenido extraído del PDF..."
}
}Respuesta de error (422):
{
"error": "Fallo al procesar pdf",
"detalles": "Descripción del error específico"
}Los archivos PDF se almacenan en el directorio Data_temp_uploads/ (este directorio está excluido del control de versiones por seguridad).
- Flask 3.1.2 - Framework web para Python
- pypdf 6.1.1 - Librería para procesamiento de PDFs
- Werkzeug - Utilidades WSGI (incluida con Flask)
El proyecto implementa Inyección de Dependencias y Inversión de Control a través de interfaces:
- Domain/Interfaces/: Define contratos para servicios
- Application/Services/: Implementa casos de uso
- Infraestructure/: Implementaciones concretas de infraestructura
- Presentation/: Controladores web (Flask)
- Define la interfaz en
Domain/Interfaces/ - Implementa el caso de uso en
Application/Services/ - Crea la implementación técnica en
Infraestructure/ - Expone la funcionalidad en
Presentation/
- Haz fork del repositorio
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Haz commit de tus cambios (
git commit -am 'Agrega nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abre un Pull Request
- El servidor está configurado en modo debug para desarrollo
- Los archivos PDF subidos se almacenan localmente
- Asegúrate de tener permisos de escritura en el directorio del proyecto
- Asegúrate de que el entorno virtual esté activado
- Ejecuta
pip install -r requirements.txt
- Verifica permisos de escritura en el directorio
- En Windows, ejecuta como administrador si es necesario
- Cambia el puerto en
main.py:app.run(debug=True, port=5001) - O detén el proceso que use el puerto 5000
Proyecto desarrollado para el curso de Informática Aplicada - UCR 2025