81 lines
5.2 KiB
Markdown
81 lines
5.2 KiB
Markdown
|
|
# Tecnologías del backend
|
||
|
|
|
||
|
|
Este documento explica qué tecnologías usa el backend (servidor y motor) y por qué
|
||
|
|
se han elegido frente a otras alternativas.
|
||
|
|
|
||
|
|
## 1. Lenguaje
|
||
|
|
|
||
|
|
El backend se desarrolla en **Python 3.12**. CadQuery solo admite de 3.12 a 3.13,
|
||
|
|
como fija el `pyproject.toml`.
|
||
|
|
|
||
|
|
La razón principal es que Python tiene bibliotecas maduras y gratuitas para leer
|
||
|
|
archivos CAD y generar sólidos 3D. En Java o C#, lo equivalente es mucho más
|
||
|
|
limitado o necesita licencias comerciales. Además, permite crear APIs rápidamente.
|
||
|
|
|
||
|
|
## 2. Bibliotecas
|
||
|
|
|
||
|
|
### 2.1. Motor: geometría y modelado
|
||
|
|
|
||
|
|
| Tecnología | Para qué se usa | Por qué esta y no otra |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| **ezdxf** | Leer las entidades, capas, tipos de línea, textos y cabecera de los DXF. | Es la biblioteca de referencia en Python para DXF: admite todas las versiones, está bien documentada y no necesita AutoCAD. |
|
||
|
|
| **shapely** | Geometría 2D de las vistas: unir segmentos, formar contornos, calcular áreas y saber si un contorno está dentro de otro. | Resuelve en una línea operaciones que a mano serían largas y darían problemas de tolerancia. |
|
||
|
|
| **numpy** | Cálculos con coordenadas y tolerancias. | Estándar en Python, y ya lo usa CadQuery. |
|
||
|
|
| **CadQuery** (OpenCASCADE) | Construir los sólidos (celdas, extrusiones, booleanas), proyectar aristas y exportar a STEP y STL. | Usa OpenCASCADE, el mismo núcleo que FreeCAD, con una API en Python más sencilla. pythonOCC ofrece lo mismo con un código más complejo, y FreeCAD es pesado para usarlo dentro de un servidor. |
|
||
|
|
| **OR-Tools (CP-SAT)** | Elegir qué celdas forman la pieza para que sus proyecciones coincidan con el plano. | El prototipo prueba todas las combinaciones, y eso no funciona a partir de unas 18 celdas. CP-SAT resuelve el mismo problema como restricciones. |
|
||
|
|
|
||
|
|
### 2.2. Servidor: API, seguridad y base de datos
|
||
|
|
|
||
|
|
| Tecnología | Para qué se usa | Por qué esta y no otra |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| **FastAPI** | Crear la API REST con la que se comunica el frontend. | Más moderna y rápida que Flask, valida los datos sola y genera la documentación Swagger sin trabajo extra. Django sería excesivo para una API. |
|
||
|
|
| **Uvicorn** | Servidor que ejecuta FastAPI. | Es el recomendado por FastAPI. |
|
||
|
|
| **Pydantic** | Definir y validar los datos que entran y salen de la API. | Viene integrado con FastAPI. |
|
||
|
|
| **SQLAlchemy** | Acceder a MySQL mediante un ORM. | Es el ORM más usado en Python y evita escribir SQL a mano en cada consulta. |
|
||
|
|
| **PyMySQL** | Conectar SQLAlchemy con MySQL. | Está escrito en Python puro y se instala sin problemas en Docker. |
|
||
|
|
| **Alembic** | Gestionar las migraciones de la base de datos. | Es la herramienta oficial de migraciones de SQLAlchemy. |
|
||
|
|
| **passlib (bcrypt)** | Calcular el hash de las contraseñas. | bcrypt es lento por diseño, lo que dificulta los ataques de fuerza bruta. |
|
||
|
|
| **PyJWT** | Generar y verificar los tokens de sesión. | Permite una autenticación sin estado, adecuada para una API REST. |
|
||
|
|
|
||
|
|
### 2.3. Pruebas
|
||
|
|
|
||
|
|
| Tecnología | Para qué se usa | Por qué esta y no otra |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| **pytest** | Pruebas del motor (catálogo de piezas) y de la API. | Es el estándar en Python, con una sintaxis más sencilla que *unittest*. |
|
||
|
|
| **httpx** (`TestClient` de FastAPI) | Llamar a los endpoints desde las pruebas sin levantar el servidor. | Es lo que usa FastAPI para probar. |
|
||
|
|
|
||
|
|
## 3. Base de datos
|
||
|
|
|
||
|
|
Se usa **MySQL 8** para guardar los usuarios (con la contraseña cifrada), los
|
||
|
|
proyectos, el historial de conversiones con sus avisos y las rutas de los archivos
|
||
|
|
generados.
|
||
|
|
|
||
|
|
Los archivos en sí (DXF, STEP, STL) no se guardan en la base de datos, sino en un
|
||
|
|
volumen de Docker, porque pueden ser grandes.
|
||
|
|
|
||
|
|
Se ha elegido MySQL porque el equipo ya lo conoce del ciclo y cubre de sobra las
|
||
|
|
necesidades del proyecto. PostgreSQL sería una alternativa igual de válida.
|
||
|
|
|
||
|
|
## 4. Herramientas de desarrollo
|
||
|
|
|
||
|
|
| Herramienta | Uso en el proyecto |
|
||
|
|
| --- | --- |
|
||
|
|
| **uv** | Gestionar las dependencias con `pyproject.toml` y `uv.lock`, tanto en local como dentro de la imagen Docker, para tener las mismas versiones en todas partes. |
|
||
|
|
| **Docker** | Ejecutar el backend con todas sus dependencias. CadQuery es especialmente delicado de instalar, y el contenedor evita problemas entre equipos. |
|
||
|
|
| **Docker Compose** | Levantar juntos el backend y MySQL, y lanzar las pruebas contra una base de datos de pruebas, con un solo comando. |
|
||
|
|
| **Git y Gitea del instituto** | Control de versiones, ramas por tarea, *pull requests* revisados, *issues* y tablero, según `CONTRIBUTING.md`. |
|
||
|
|
| **Visual Studio Code** | Editor y depurador, con integración de Python, Git y Docker. |
|
||
|
|
| **Swagger UI** | Probar los endpoints desde el navegador. Lo genera FastAPI en `/docs`. |
|
||
|
|
| **FreeCAD / Fusion 360** | Abrir los STEP generados y comprobar que la pieza es correcta. |
|
||
|
|
|
||
|
|
## 5. Ampliación futura
|
||
|
|
|
||
|
|
| Tecnología | Para qué se usará |
|
||
|
|
| --- | --- |
|
||
|
|
| **PyMuPDF** | Extraer los trazos vectoriales de los planos en PDF. |
|
||
|
|
| **OpenCV** y **Tesseract OCR** | Detectar líneas y leer cotas en planos escaneados. |
|
||
|
|
|
||
|
|
*Riesgo identificado: reconocer cotas con OCR en planos reales es poco fiable
|
||
|
|
(símbolos especiales, textos girados, solapamientos). Por eso queda como
|
||
|
|
ampliación y no como parte del producto mínimo.*
|