Creación de HTML index, modificación de SP, modificaciones en el controlador, entre otros.
Fecha: Domingo 22 de marzo 2026
Hora de inicio: 8:00 a.m. (aproximadamente)
Hora de Finalización: 5:10 p.m.
Hora de inicio: 7:40 p.m.
Hora de Finalización: 9:00 p.m.
Total de horas trabajadas: 10 h 30 min
*Nota: Esta bitácora se está realizando el día 23/03/26, porque el día de las actividades realizadas me encontraba muy cansada para realizar la bitácora. Los movimientos en el repositorio comprueban que el trabajo realizado corresponde al día 22/03/26.*
La idea de esta sesión era terminar la parte programada que quedaba. El plan inicial era crear los html correspondientes y terminar de conectarlos con el modelo por medio del controlador, sin embargo, terminamos modificando partes que anteriormente creíamos completadas debido a que en un inicio se nos complicó no usar SQL incrustado.
Actividades Realizadas
8:00 a.m. - 12:00 m.d.
Durante este lapso me encargué principalmente de investigar todo lo relacionado con el desarrollo de páginas web, ya que era un área bastante nueva para mí, antes de esta tarea, solo había visto información muy superficial sobre el tema, y antes de este lapso mi mayor fuente de información sobre el tema fueron algunos videos que vi el día anterior, que mencionaban esta área pero no era mi foco de atención cuando los vi, por lo que fue necesario dedicar un tiempo prudente a la investigación.
Empecé investigando qué es HTML y cómo funciona su estructura básica. Aprendí que no es un lenguaje de programación sino un lenguaje de marcado, donde cada elemento se define con etiquetas de apertura y cierre. Luego investigué CSS, que es el lenguaje que define el aspecto visual de la página, colores, tamaños, espaciado, etc. Como no íbamos a escribir CSS desde cero, investigué más a fondo Bootstrap, que es una librería CSS que provee clases predefinidas para hacer páginas con diseño bonito sin necesidad de escribir estilos manualmente. Más adelante (cuando ya estaba diseñando el HTML) descubrí que se puede implentar mediante CDN, o sea, un link en el HTML que carga la librería desde internet sin necesidad de descargar nada, al final esto fue lo que terminamos usando en esa parte.
También investigué las bases de Jinja2, que es el motor de templates de Flask. Era importante tener presente Jinja 2 porque es lo que nos permite implementar código de Python en html, usando {{variabe}} y {% for %} sobre todo. Lo anterior era necesario para que en la página se mostraran los empleados.
Si debo resumir lo que hice durante este proceso sería:
- Investigar bases de HTML
- Investigar bases de CSS (boostrap y Style)
- Bases de Jinja2 (no ocupaba un conocimiento muy avanzado, solo lo más básico)
12:00 m.d. - 5:10 p.m.
Este archivo es parte de la Vista en el patrón MVC y es la página principal de la aplicación, la primera que ve el usuario al abrir la app. Aquí utilicé los conocimientos reunidos en horas tempranas, es un archivo de casi 100 líneas, pero realmente teniendo noción básica de html, CSS y Jinja2 es muy fácil de comprender, así que voy a mencionar generalidades del archivo.
Bootstrap via CDN
Img3: boostrap vía CDFSe cargó Bootstrap desde internet mediante un link. Esto evita tener que descargar nada y con solo agregar clases a los elementos HTML, Bootstrap aplica estilos automáticamente.
Estilos con <style>
Img4: estilos propios
En un inicio no usé style, pero dado que en realidad es bastante fácil de implementar y que la diferencia era muy notoria con o sin, decidí implementarlo.Los estilos propios se agregaron después del link de Bootstrap, importante para que los estilos propios se implementen en vez de los de Bootstrap. Se definió colores para el fondo, el navbar, etc. Además, se definió el estilo de letra.
Tabla de scroll
Img5: Código para Scrollbar
La tabla se envolvió en un div con altura y un scroll (vertical) para que no se muestren todos los empleados de golpe.
For implementado con Jinja2
Img6: for de python implementado con Jinja2
Es una de las partes más importantes, porque básicamente es lo que permite que los empleados se reflejen en la página. El for recorre la lista de empleados que envía Flask desde el controller, y por cada uno genera una fila (id, nombre, salario).
Botón de insertar
Img7: Implementación del botón para insertar
Este botón redirige a /insertar usando <a>. Al darle click el usuario es llevado al formulario de inserción (en un principio no hacía nada porque aún no se había creado dicho formulario, pero una vez se creó funcionó a la perfección).
La solución fue modificar el SP para eliminar @resul de la firma y declararlo internamente co. De esta manera, deja de ser un parámetro externo y se convierte en una variable local del SP, por lo que Python no necesita conocerla ni manejarla (O sea, Pyodbc no debe tratar directamente con ella). Para comunicar el resultado hacia afuera, el SP utiliza un SELECT @resul al final, que Python puede leer normalmente con fetchone() como si fuera cualquier consulta que retorna datos.
Img9: @resul declarado como variable locarl
Adicionalmente, fue necesario agregar SET NOCOUNT ON al inicio del SP.
Img10: El error que se presenta sin SET NOCOUNT ON
Esto se debe a que cuando Python llama al SP, SQL Server manda dos cosas en secuencia: primero un mensaje interno indicando cuántas filas fueron afectadas por el INSERT, y luego el resultado del SELECT @resul. Pyodbc leía esa secuencia en orden y agarra el primer resultado que encuentra, que era el mensaje del INSERT y no el SELECT resul. Con SET NOCOUNT ON se le indica a SQL Server que no mande esos mensajes de filas afectadas, por lo que el único resultado que llega a Python es el SELECT @resul, que es el que realmente se necesita leer.
Con esos cambios en el SP, la llamada desde Python quedó sin SQL incrustado, utilizando únicamente la sintaxis CALL con los dos parámetros de entrada.
Img11: insertar_empleado antes de los cambios
Buenas prácticas descubiertas
- Agregar archivos sensibles al gitignore antes de hacer el primer commit, no después. Una vez que un archivo se sube al repositorio, aunque se elimine después, queda registro de él en el historial de versiones.
- Hacer pull antes de empezar a trabajar en cada sesión evita trabajar con versiones desactualizadas del código, como ocurrió en esta sesión donde al ejecutar las pruebas del modelo aparecían errores que ya habían sido corregidos por la compañera.
- Cuando un método de la biblioteca que se está usando no soporta cierta funcionalidad, es mejor investigar una solución alternativa que mantenga las reglas del proyecto, en lugar de usar soluciones que las violen como SQL incrustado.
- Hacer commit y push después de cada tarea completada, no acumular muchos cambios en un solo commit, facilita rastrear en qué punto se introdujo un error.
Consejos
- Antes de elegir cómo llamar a un SP con parámetros OUTPUT desde Python, verificar si la biblioteca que se usa soporta ese tipo de parámetros. En el caso de pyodbc, no maneja bien los parámetros OUTPUT con la sintaxis CALL, por lo que la solución más limpia es declarar el parámetro de retorno como variable local dentro del SP y retornarlo con un SELECT al final.
- Si al llamar un SP desde Python el resultado que se recibe no es el esperado, verificar si SQL Server está enviando mensajes adicionales antes del resultado real. Usar SET NOCOUNT ON al inicio del SP elimina esos mensajes y asegura que Python reciba únicamente el resultado que interesa.
- Coordinar con el equipo antes de cambiar la firma de un SP, ya que eso afecta tanto el código SQL como el código Python que lo llama.
- TUTORIAL FLASK #6 - Plantillas html JINJA2: https://youtu.be/faJvSBNRXUY?si=hgpLvlcywbVSJkTG
- TUTORIAL FLASK #2 - Rutas y métodos (post y get): https://youtu.be/tO8xrJxXUBA?si=BdP1zA_LJuJrhfXb
- TUTORIAL FLASK #6 - Plantillas html JINJA2: https://youtu.be/faJvSBNRXUY?si=7Q3vtFvRfIi9jvnv
- Curso Básico de HTML5 y CSS3 Desde Cero: https://youtu.be/Y-OhzQpsRwI?si=HA1PIgfwn3NKDNAN
- Curso COMPLETO de HTML GRATIS desde cero: SEO, semántica y más: https://youtu.be/3nYLTiY5skU?si=91StITg5k3QrVfW7
- Aprende Bootstrap en menos de 20 minutos - Tutorial de sitios web adaptables: https://youtu.be/eow125xV5-c?si=eB7WGtmz3DDaPUW1
- Calling Stored Procedures: Calling Stored Procedures · mkleehammer/pyodbc Wiki
- Pyodbc: mkleehammer/pyodbc: Puente ODBC en Python
- Get started with Bootstrap: Get started with Bootstrap · Bootstrap v5.3
- CSS variables: CSS variables · Bootstrap v5.3
- COMO CREAR UNA PÁGINA WEB BÁSICA CON PYTHON (Flask) Y HTML 2024: https://youtu.be/MGAZnar1QbI?si=T6ihIDRUc_68Y2vL
- Aprende CSS en 15 Minutos: https://youtu.be/3yM5uXp-T_0?si=QRddHf3qpZk6uZXN
- ¿Cómo implementar loops for en Flask usando Jinja2 en Python? | Curso de Flask | E04: https://youtu.be/wHhgPkwQcis?si=JWRRymZ2m9I2Rh_q
- HTML en 5 minutos | Te lo explico así nomás: https://youtu.be/EvKm8yhM7V8?si=cQfAmxH2M-aY-Rcs
- Lenguaje HTML-HTML en Español: Lenguaje HTML - HTML en español
Comentarios
Publicar un comentario