Este tutorial adapta pedagógicamente el Día 56. Las secciones 📝 Contenido original del curso y 📝 Ejercicio original del curso provienen de las lecciones 400 a 405. Los retos 🟢🟡🟠🔴, las secciones sobre rutas de archivos, licencias y privacidad, el proyecto extra y la etapa 3 del proyecto integrador son creaciones de esta adaptación. Las correcciones al material original aparecen como 🛠️ Nota técnica.
Nota sobre las verificaciones: el 27 de septiembre de 2026, con Python 3.14 y Flask 3.1.3, se comprobó: que una ruta relativa
static/...falla en páginas con rutas anidadas, queurl_for('static', ...)genera/static/..., y las cabeceras de caché que Flask envía hoy para los archivos estáticos. En html5up.net se comprobó que la licencia es Creative Commons Attribution 3.0, que la plantilla Identity que usa el curso ya no aparece en el catálogo del sitio y que Aerial y Paradigm Shift sí se pueden descargar; se revisó la estructura de carpetas de Aerial.
Tabla de contenidos
- Antes de empezar: de cadenas de texto a archivos HTML
- Renderizar archivos HTML con
render_template - Servir archivos estáticos
- 📍 Rutas de archivos: relativas, absolutas y
url_for - Usar plantillas de sitios web
- 🚀 Proyecto del día: la tarjeta de presentación web
- 🌟 Proyecto extra: el sitio de la feria de ciencias
- 🏗️ Proyecto integrador del bloque Flask — Etapa 3
- 🧩 Comprueba lo aprendido
- 🤖 Programar con apoyo de IA
- 🛠️ Correcciones técnicas al material original
- 📋 Matriz de trazabilidad
- 📦 Evidencias de aprendizaje del Día 56
0. Antes de empezar: de cadenas de texto a archivos HTML
(Fuente: 400 - Day 56 Goals- what you will make by the end of the day.md)
📝 Contenido original del curso
Hoy se aprende a incluir archivos estáticos (imágenes, videos, CSS) y a renderizar archivos HTML completos desde Flask, como los que hiciste en los Días 41 a 44. El resultado del día: una tarjeta de presentación personal en la web. "Es el siglo XXI": en lugar de entregar tarjetas de papel, puedes tener un sitio con tu nombre, tus enlaces y tus datos de contacto.
Prerequisitos: Flask con rutas y modo de depuración (Días 54 y 55), HTML y CSS (Días 41 a 44), herramientas de desarrollo de Chrome (Día 45), línea de comandos (Día 54).
📖 Privacidad en tu tarjeta (adaptación)
Una tarjeta en la web es pública. Para un estudiante, lo prudente es:
| ✅ Sí | ❌ No |
|---|---|
| Nombre de pila o un seudónimo | Dirección, teléfono personal, número de documento |
| Intereses, proyectos, habilidades | Colegio y curso juntos con tu foto |
| Enlace a tu GitHub o portafolio | Enlaces a redes personales sin revisar su privacidad |
| Una imagen o avatar dibujado | Fotos donde se vea tu casa o tu uniforme |
Mientras el servidor corra en 127.0.0.1, nadie más lo ve. Pero piensa desde ya en lo que publicarías.
1. Renderizar archivos HTML con render_template
(Fuente: 401 - Rendering HTML Files with Flask.md)
🎯 Objetivo de aprendizaje
Servir un archivo HTML completo desde Flask usando la carpeta templates y render_template.
📝 Contenido original del curso
La profesora crea un proyecto my-personal-site con un archivo server.py y pide repasar la aplicación mínima (importar Flask, crear app, la ruta /, if __name__ == "__main__": app.run(debug=True)).
Luego crea index.html (el editor agrega el esqueleto: DOCTYPE, html, head, body), le pone un <title> y un <h1>. Para mostrarlo, según el Quickstart de Flask:
- Flask es un framework: pone reglas. Las plantillas HTML deben estar en una carpeta llamada
templates(en minúsculas). - Se importa
render_templatey se devuelve su resultado:
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def home():
return render_template("index.html")
if __name__ == "__main__":
app.run(debug=True)Reto del video: tomar un sitio propio de los Días 41 y 42 (o el CV sencillo que ofrece el curso), guardarlo como HTML y servirlo con Flask. Si lo descargas de GitHub, puede tener extensión .htm: es lo mismo que .html (algunos servidores antiguos no aceptaban extensiones de cuatro letras); cámbiala y acorta el nombre (por ejemplo, angela.html). Si el archivo estuviera en una subcarpeta, la ruta se escribe completa: render_template("cv/angela.html").
Al renderizar el CV, todo aparece… menos la foto. Para eso hay que aprender a servir archivos estáticos.
📖 Estructura de un proyecto Flask
my-personal-site/
├── server.py
├── templates/ ← archivos .html (render_template los busca aquí)
│ └── index.html
└── static/ ← CSS, imágenes, JavaScript, videos (sección 2)
├── css/
│ └── styles.css
└── images/
└── foto.pngtemplates y static se buscan junto al módulo de tu aplicación: por eso se pasa __name__ a Flask(...) (Día 54).
⚠️ Errores frecuentes
| Error | Causa | Solución |
|---|---|---|
jinja2.exceptions.TemplateNotFound: index.html |
La carpeta se llama template, Templates o plantillas, o el archivo está fuera de ella |
Carpeta templates, exacta y en minúsculas, junto a server.py |
TemplateNotFound aunque la carpeta está bien |
Ejecutas desde otra carpeta y creaste la app con Flask("__name__") entre comillas |
Flask(__name__), sin comillas |
TemplateNotFound: cv/angela.html |
Escribiste cv\angela.html con barra invertida |
En las rutas de plantillas usa siempre / |
| La página no cambia al editar el HTML | Servidor sin modo de depuración | debug=True o --debug |
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1 — Aplicación: sirve tu sitio de los Días 41 y 42 en la ruta
/. - 🟡 Reto 2 — Ampliación: agrega una segunda plantilla
contacto.htmlen la ruta/contactoy enlaza las dos páginas entre sí. - 🟠 Reto 3 — Desafío: organiza tres plantillas en subcarpetas (
templates/paginas/...) y sírvelas con rutas distintas. - 🔴 Reto 4 — Pensamiento computacional: ¿qué diferencia hay entre abrir
index.htmlcon doble clic y verlo enhttp://127.0.0.1:5000/? Compara la barra de direcciones, quién entrega el archivo y qué pasa si otra persona en la red intenta abrir cada uno.
2. Servir archivos estáticos
(Fuente: 402 - Serving Static Files using Flask.md)
🎯 Objetivo de aprendizaje
Usar la carpeta static para imágenes y CSS, enlazarlos desde las plantillas y entender la caché del navegador.
📝 Contenido original del curso
En la Consola de las herramientas de desarrollo aparecen errores 404 para styles.css y angela.png: el navegador los pide y el servidor no los encuentra. Aunque pongas la imagen junto al HTML, sigue sin aparecer. La razón: igual que las plantillas van en templates, Flask busca los archivos estáticos en una carpeta llamada static. "Ellos hicieron el framework, ellos hicieron las reglas".
Con la imagen en static/, la etiqueta queda:
<img src="static/angela.png" alt="Foto de Angela">"Nueve de cada diez veces" un proyecto Flask tendrá las carpetas templates y static.
Reto del video: crear static/styles.css que ponga el fondo del body en morado, y enlazarlo en el <head>:
body {
background-color: purple;
}<link rel="stylesheet" href="static/styles.css">La caché de Chrome. La profesora cambia el color a rojo, guarda, reinicia el servidor… y sigue morado. En las herramientas de desarrollo, Fuentes muestra la versión vieja de styles.css. Chrome guarda en caché los archivos estáticos (CSS, imágenes, JavaScript) para ahorrar datos, porque es raro que un sitio los cambie en el mismo día. La solución: una recarga forzada, manteniendo Mayús y pulsando el botón de recargar.
📖 Recarga forzada: atajos (adaptación)
| Sistema | Atajo |
|---|---|
| Windows / Linux | Ctrl + F5 o Ctrl + Mayús + R |
| Mac | Cmd + Mayús + R |
| Cualquiera | Herramientas de desarrollo abiertas → pestaña Red → marcar Desactivar caché (funciona mientras estén abiertas) |
🛠️ Nota técnica (Flask 3.1, verificado): en versiones antiguas, Flask pedía al navegador guardar los estáticos durante 12 horas, y por eso el video necesitaba la recarga forzada. Desde Flask 2.0, responde con
Cache-Control: no-cachey una etiquetaETag: el navegador pregunta en cada visita si el archivo cambió (si no, recibe un rápido304 Not Modified). Por eso hoy es menos frecuente ver el CSS viejo. Aun así, la recarga forzada sigue siendo el primer paso cuando "no se ve el cambio", sobre todo con otros servidores o con extensiones del navegador.
⚠️ Errores frecuentes
| Error | Causa | Solución |
|---|---|---|
| 404 de la imagen en la Consola | La imagen no está en static o el nombre no coincide |
Revisa carpeta, nombre y extensión (.png contra .jpg) |
| Funciona en Windows y falla al publicarlo | Foto.PNG en el disco y foto.png en el HTML |
Nombres de archivo en minúsculas, sin espacios ni tildes |
| El CSS no se aplica | <link> fuera del <head>, rel mal escrito o ruta incorrecta |
Revisa la pestaña Red: ¿el CSS responde 200? |
| Sigue el estilo viejo | Caché | Recarga forzada |
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1: agrega tu imagen (o un avatar) y una hoja de estilos con un color de fondo y una fuente de Google Fonts.
- 🟡 Reto 2: abre la pestaña Red y recarga. Anota el código de estado de cada archivo (200, 304, 404). Luego haz una recarga forzada y compara.
- 🟠 Reto 3: agrega un favicon (
static/favicon.icoo.png) con<link rel="icon" href="...">. - 🔴 Reto 4: mide cuánto pesan tus imágenes (pestaña Red, columna Tamaño). Si alguna pasa de 500 KB, redúcela y compara el tiempo de carga. ¿Por qué importa en un celular con pocos datos?
3. 📍 Rutas de archivos: relativas, absolutas y url_for
(Sección creada para esta adaptación a partir de las lecciones 402 y 403.)
🎯 Objetivo de aprendizaje
Elegir la forma de escribir la ruta de un archivo estático que funcione en todas las páginas del sitio.
📖 Explicación conceptual
El curso escribe src="static/angela.png", sin barra al inicio. Es una ruta relativa: el navegador la completa a partir de la dirección de la página actual. Funciona en /, pero observa qué pasa en una página más profunda (verificado con Flask 3.1):
| Página actual | href="static/css/styles.css" se convierte en |
Resultado |
|---|---|---|
http://127.0.0.1:5000/ |
/static/css/styles.css |
✅ 200 |
http://127.0.0.1:5000/blog/post |
/blog/static/css/styles.css |
❌ 404 |
Tres formas de escribir la ruta:
| Forma | Ejemplo | Funciona en páginas anidadas |
|---|---|---|
| Relativa (la del curso) | static/css/styles.css |
❌ |
| Absoluta desde la raíz | /static/css/styles.css |
✅ |
Con url_for (recomendada por Flask) |
{{ url_for('static', filename='css/styles.css') }} |
✅ y se adapta si la aplicación cambia de ubicación |
url_for es una función de las plantillas de Flask (verificado: genera /static/css/styles.css). Las llaves dobles {{ }} son sintaxis de Jinja, que estudiarás a fondo el Día 57. Por hoy basta con saber que Flask la reemplaza por la ruta correcta al renderizar.
🛠️ Nota técnica: las rutas dentro de un archivo CSS (por ejemplo,
url("images/bg.jpg")) son relativas al archivo CSS, no a la página. Por eso, al mover una plantilla completa astatic/, las imágenes de fondo definidas en el CSS siguen funcionando sin cambios, y solo hay que corregir las rutas del HTML.
4. Usar plantillas de sitios web
(Fuente: 403 - How to Use Website Templates to Speed Up Web Development.md)
🎯 Objetivo de aprendizaje
Adaptar una plantilla HTML/CSS profesional a un proyecto Flask, respetando su licencia.
📝 Contenido original del curso
Primer reto: servir con Flask el sitio personal (con CSS, imágenes, GIF y favicon) que se ofrece como archivo ZIP en los recursos. Pasos:
index.htmlva atemplates; todo lo demás (CSS, favicon, carpeta de imágenes) va astatic.- El
server.pyno cambia: sigue renderizandoindex.html. - En el HTML, cada ruta a un archivo local debe incluir
static/. Un atajo: Buscar y reemplazar (Ctrl + R en PyCharm)images/→static/images/.
Plantillas gratuitas. Sitios como HTML5 UP ofrecen plantillas atractivas. La profesora descarga Paradigm Shift:
- Gratis, pero hay que dar crédito al diseñador. Para uso comercial sin atribución, el diseñador ofrece una opción paga de 19 dólares con todas sus plantillas y soporte. Compáralo con servicios como Squarespace: 10 a 30 dólares al mes.
- Las imágenes de la demostración no vienen en la descarga (el diseñador no tiene derechos para distribuirlas): vienen degradados de reemplazo.
- Mover
index.htmlatemplatesy las carpetasimagesyassetsastatic; luego reemplazarimages/→static/images/yassets/→static/assets/.
Editar la plantilla en vivo. En la Consola de Chrome:
document.body.contentEditable = true(En JavaScript, true va en minúscula.) Ahora puedes escribir directamente sobre la página; con la herramienta de selección de las herramientas de desarrollo puedes borrar secciones completas con la tecla Retroceso. Pero al recargar todo se pierde, porque el navegador vuelve a pedir el archivo al servidor. Para conservar los cambios: guardar la página (Ctrl + S), mover ese HTML a templates y reemplazar el anterior.
📖 Licencias: gratis no significa "sin reglas" (adaptación)
Las plantillas de HTML5 UP usan la licencia Creative Commons Attribution 3.0 (verificado en html5up.net): puedes usarlas, modificarlas y hasta venderlas, siempre que des crédito al autor. Por eso, en la solución del proyecto, la profesora deja el pie de página con el crédito. La opción paga que menciona el video corresponde a Pixelarity, el servicio de pago del mismo autor (enlazado desde html5up.net).
| Recurso | ¿Puedo usarlo? | Condición |
|---|---|---|
| Plantilla de HTML5 UP | Sí | Mantener el crédito ("Design: HTML5 UP") |
| Foto de Unsplash | Sí, incluso comercialmente | El crédito al fotógrafo no es obligatorio, pero se agradece |
| Imagen de Google Imágenes | Casi nunca | Tiene dueño; revisa la licencia de la página de origen |
| GIF de Giphy (Día 55) | Para uso personal y educativo, enlazándolo | Revisa las condiciones de Giphy si es para algo comercial |
⚠️ Errores frecuentes
| Error | Causa | Solución |
|---|---|---|
| La plantilla se ve sin estilos | Las rutas de assets/ no tienen static/ |
Buscar y reemplazar, o mejor /static/assets/ |
| Una imagen dejó de verse después del reemplazo | Reemplazaste images sin la barra final y rompiste otra cadena (por ejemplo, avatar-images) |
Reemplaza con la barra (images/) y revisa uno por uno |
Los cambios hechos con contentEditable desaparecen |
Solo cambiaste la copia en el navegador | Guarda la página y reemplaza el archivo en templates |
| La página guardada con Ctrl + S tiene rutas raras | Chrome crea una carpeta _files y reescribe rutas |
Copia solo el HTML y corrige las rutas a static/ |
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1: descarga una plantilla de html5up.net, identifica su archivo de licencia (
LICENSE.txt) y resume en dos líneas qué te permite hacer. - 🟡 Reto 2: sírvela con Flask usando
url_for(sección 3) en lugar destatic/relativo. - 🟠 Reto 3: con
contentEditable, simplifica la plantilla a tres secciones, guárdala y deja la versión final entemplates. Compara el número de líneas antes y después. - 🔴 Reto 4: escribe una lista de verificación para "adoptar una plantilla" en cualquier proyecto futuro (licencia, estructura de carpetas, rutas, imágenes de reemplazo, crédito, privacidad).
5. 🚀 Proyecto del día: la tarjeta de presentación web
(Fuente: 404-final-project-name-card-website-template.md y 405 - Solution and Walkthrough for the Name Card Final Project.md)
📝 Ejercicio original del curso
Crear una tarjeta de presentación en la web con una plantilla de HTML5 UP, "como las de papel, pero mejor".
- Descarga la plantilla Identity de los recursos de la lección (o elige otra en html5up.net, como Astral o Ethereal).
- Crea un proyecto
name-cardcon una aplicación Flask desde cero. - Crea las carpetas necesarias y mueve los archivos de la descarga.
- Haz que el sitio funcione en la ruta raíz (
/). - Personalízalo: cambia la imagen de fondo, el texto y los enlaces. Hazlo tuyo.
El recorrido de la solución (lección 405):
- Servidor Flask con la ruta
/y modo de depuración; carpetastemplatesystatic;index.htmlatemplates,assetseimagesastatic. - Si otro proyecto sigue corriendo en la misma dirección, aparece "la dirección ya está en uso": detenlo primero.
- Sin estilos al principio → reemplazar
assets/porstatic/assets/eimages/porstatic/images/. - Si aparece el CSS de la plantilla anterior, es la caché → recarga forzada.
- Cambiar el
<h1>, loshrefde las redes sociales y el pie de página, dejando el crédito a HTML5 UP porque se usa gratis. - La foto del avatar desapareció porque el reemplazo se hizo sin la barra final; al corregirlo, reemplazar el avatar por una foto propia.
- Fondo: descargar una foto de Unsplash, renombrarla igual que la original (
bg.jpg) y reemplazarla. Así no hay que tocarmain.css, que ya la usa bajo un degradado. - Por último, cambiar el
<title>.
🛠️ Nota técnica (verificado el 27/09/2026): la plantilla Identity ya no aparece en el catálogo de html5up.net (su página devuelve 404); solo está en el ZIP de los recursos del curso. Si no tienes acceso a ese ZIP, Aerial (
html5up.net/aerial) es una tarjeta de presentación muy parecida y se descarga sin problema. En Aerial,index.htmlsolo enlazaassets/css/main.cssyassets/css/noscript.css, y el fondobg.jpgestá enassets/css/images/: como está referenciado desde el CSS, basta con mover la carpetaassetsastaticy corregir dos rutas del HTML (sección 3).
Problema y contexto
Necesitas presentarte (a un club, en una feria, en una hoja de vida) con un enlace en lugar de un papel, sin diseñar todo desde cero.
🔍 Antes de programar
- ¿Qué archivos de la descarga son plantillas y cuáles son estáticos?
- ¿Cuántas rutas hay que corregir en el HTML? (Búscalas antes de reemplazar.)
- ¿Qué datos personales vas a mostrar y cuáles no? (Sección 0.)
- ¿De dónde saldrá tu imagen de fondo y qué licencia tiene?
Requisitos funcionales
- El sitio carga en
/con todos sus estilos e imágenes (ningún 404 en la Consola). - Tu nombre (o seudónimo), una descripción corta y al menos dos enlaces reales (GitHub, portafolio, sitio del grupo).
- Imagen de fondo propia con licencia libre.
- El crédito a HTML5 UP en el pie de página.
Restricciones técnicas
- Rutas de estáticos absolutas (
/static/...) o conurl_for. - Nombres de archivos en minúsculas y sin espacios.
- Nada de datos personales sensibles.
Planificación
- Comprender la estructura de la plantilla. 2. Entradas: la plantilla, tus textos, tus imágenes. 3. Procesos: mover archivos → corregir rutas → personalizar. 4. Salida: la tarjeta en
/. 5. Dividir en esos tres pasos. 6. Diseñar el contenido en papel (qué dirá cada sección). 7. Implementar. 8. Probar (Consola sin 404). 9. Corregir. 10. Mejorar.
Construcción paso a paso
- Versión 1:
server.pyque renderizaindex.html(se ve sin estilos). - Versión 2: rutas corregidas; se ve igual que la demostración.
- Versión 3: textos y enlaces propios.
- Versión 4: avatar y fondo propios.
- Versión final:
<title>, favicon y revisión de privacidad.
Pruebas
| Caso | Resultado esperado |
|---|---|
Consola de Chrome al cargar / |
Ningún error 404 |
| Pestaña Red | CSS, imágenes y fuentes con 200 o 304 |
| Clic en cada enlace | Abre el destino correcto |
| Vista de celular (herramientas de desarrollo → barra de dispositivos) | Se ve bien y se lee sin hacer zoom |
| Pie de página | Crédito a HTML5 UP presente |
🧪 Prueba y depuración
name-card/
├── server.py
├── template/
│ └── index.html
└── static/
└── assets/
└── css/main.css<link rel="stylesheet" href="assets/css/main.css" />
<img src="static/images/Avatar.JPG" alt="">Encuentra cuatro problemas: la carpeta se llama template (sin s), la ruta del CSS no incluye static, la imagen apunta a static/images/ pero en la estructura no existe esa carpeta (y el nombre tiene mayúsculas), y el alt está vacío en una imagen que sí aporta información.
⭐ Extensión del proyecto
- Una segunda ruta
/proyectoscon otra plantilla que muestre tres de tus proyectos del curso. - Un código QR (con la biblioteca
qrcode) que apunte a tu tarjeta, para imprimirlo.
6. 🌟 Proyecto extra: el sitio de la feria de ciencias
(Proyecto creado para esta adaptación; no existe en el curso original.)
Situación
El colegio organiza una feria de ciencias con 8 proyectos. La coordinación quiere una página por proyecto y una portada, servidas desde el computador de la sala de informática durante la feria.
Requisitos
- Elige una plantilla de html5up.net distinta de la del proyecto del día y justifica la elección (licencia, estructura, cómo se ve en celular).
- Una portada en
/y una ruta/proyecto/<int:numero>que renderice la misma plantillaproyecto.htmlpara los 8 proyectos. (Hoy puedes hacer 8 archivos HTML o elegir el archivo según el número; mañana, con Jinja, bastará con uno y los datos en Python.) - Todas las imágenes en
static/con licencia libre y un archivoCREDITOS.mdque diga de dónde salió cada una. - Rutas estáticas con
url_foro absolutas.
Decisiones que debes tomar (y justificar)
- ¿Qué haces si alguien visita
/proyecto/9? - ¿Cuánto pesan todas las imágenes juntas? ¿Se cargarán bien en 30 celulares a la vez por el wifi del colegio?
Casos de prueba
- Las 8 páginas cargan sin 404 en la Consola.
/proyecto/9y/proyecto/abcmuestran un mensaje o un 404, no el depurador.
7. 🏗️ Proyecto integrador del bloque Flask — Etapa 3
(Proyecto creado para esta adaptación. Descripción completa en el tutorial del Día 58.)
El Portal del Grupo — Etapa 3 (hoy):
- Mueve el sitio del grupo de los Días 41 a 44 a
portal_grupo/templatesyportal_grupo/static. - Cada página del sitio se sirve con su propia ruta de Flask (
/,/integrantes,/actividades,/contacto). - Todas las rutas de CSS e imágenes con
url_for('static', ...). - Revisa la privacidad: reemplaza cualquier dato real de integrantes por datos ficticios.
- Captura de la Consola sin errores 404.
8. 🧩 Comprueba lo aprendido
Conceptuales
- ¿Qué va en la carpeta
templatesy qué enstatic? ¿Por qué Flask exige esos nombres? - ¿Qué hace
render_template("index.html")? - ¿Por qué
static/styles.css(sin barra) falla en la página/blog/post? - ¿Qué es la caché del navegador y cómo la saltas?
- ¿Qué te pide la licencia Creative Commons Attribution?
Análisis de código
@app.route("/")
def home():
return render_template("templates/index.html")¿Funciona? ¿Qué error aparece y por qué?
Predicción
Tu página está en http://127.0.0.1:5000/galeria/2024 y tiene <img src="static/img/foto.jpg">. ¿Qué URL pedirá el navegador? ¿Y con src="/static/img/foto.jpg"?
Depuración
Un compañero dice: "Cambié el color en styles.css, guardé, reinicié el servidor y no cambia nada". Escribe, en orden, cuatro cosas que revisarías.
Modificación
Cambia el proyecto del día para que la tarjeta tenga dos idiomas: / en español y /en en inglés, cada uno con su plantilla, compartiendo los mismos estáticos.
Creación
Desde la terminal (Día 54), crea la estructura completa de un proyecto Flask (server.py, templates/index.html, static/css/styles.css) y haz que muestre un <h1> centrado con fondo de tu color favorito.
9. 🤖 Programar con apoyo de IA
Ciclo de trabajo: formula el problema → inténtalo tú → consulta a la IA → lee y entiende → prueba → compara con la documentación oficial → modifica → explica con tus palabras.
Actividad 1 — El error de la plantilla. Provoca un TemplateNotFound y pídele a una IA que lo explique. ¿Menciona el nombre exacto de la carpeta templates? Compara con la sección "Rendering Templates" del Quickstart de Flask.
Actividad 2 — ¿Relativa o absoluta? Pregunta a una IA cuál es la mejor forma de enlazar un CSS en Flask. Si propone static/... sin barra, pruébala en una ruta anidada (sección 3) y muéstrale el resultado.
Actividad 3 — Verificar una licencia. Pregunta a una IA si puedes usar una plantilla de HTML5 UP en el sitio de una tienda. Contrasta su respuesta con la página de licencia de html5up.net y con el texto de la licencia Creative Commons Attribution 3.0. ¿Coinciden?
10. 🛠️ Correcciones técnicas al material original
| Archivo | Afirmación o comportamiento del curso | Observación | Tratamiento |
|---|---|---|---|
402, 403, 405 |
Rutas relativas static/... en el HTML |
Fallan en páginas con rutas anidadas (verificado: 404 desde /blog/post) |
Sección 3: /static/... o url_for |
402 |
Chrome guarda el CSS en caché y hay que forzar la recarga | Con Flask ≥ 2.0 los estáticos se envían con Cache-Control: no-cache y ETag (verificado); el problema es menos frecuente, pero la recarga forzada sigue siendo útil |
Nota técnica de la sección 2 |
404 |
Descargar la plantilla Identity | Ya no está en el catálogo de html5up.net (verificado); alternativa Aerial | Nota técnica de la sección 5 |
403 |
"Pagar 19 dólares" para uso comercial sin atribución | Corresponde a Pixelarity; la licencia gratuita (CC BY 3.0) sí permite uso comercial con crédito (verificado) | Sección 4: licencias |
402 |
"Mantener Mayús y pulsar recargar" | Atajos de teclado equivalentes y la opción "Desactivar caché" | Tabla de la sección 2 |
400, 404 |
Tarjeta con "datos de contacto" | Para menores de edad conviene no publicar datos sensibles | Sección 0: privacidad |
11. 📋 Matriz de trazabilidad
| Contenido original | Archivo de origen | Concepto desarrollado | Ejercicio original | Reto adicional | Proyecto relacionado |
|---|---|---|---|---|---|
| Objetivos: archivos estáticos, renderizar HTML y CSS, tarjeta de presentación | 400 |
Sección 0 | — | Privacidad en la tarjeta | Sección 5 |
Repaso de la aplicación mínima, index.html, carpeta templates, render_template, reto del CV, .htm y .html, subcarpetas, foto rota |
401 |
Sección 1 | Servir el CV con Flask | Retos 1–4 de la sección 1 | Secciones 5, 6 y 7 |
Errores 404 en la Consola, carpeta static, static/angela.png, reto del fondo morado, <link rel="stylesheet">, caché de Chrome, recarga forzada |
402 |
Sección 2 | Reto del CSS morado | Retos 1–4 de la sección 2 | Secciones 5 y 7 |
(Consecuencia de 402 y 403; no se trata en el curso) |
— | Sección 3 | — | Rutas relativas, absolutas y url_for |
Secciones 5, 6 y 7 |
Sitio personal del ZIP, buscar y reemplazar, HTML5 UP, Paradigm Shift, atribución, 19 dólares, Squarespace, imágenes de reemplazo, contentEditable, borrar elementos, guardar la página |
403 |
Sección 4 | Servir el sitio personal y la plantilla | Licencias; retos 1–4 de la sección 4 | Secciones 5 y 6 |
| Proyecto name card: plantilla Identity, proyecto desde cero, carpetas, ruta raíz, personalización | 404 |
Sección 5 | Proyecto final del día | Aerial como alternativa | Sección 5 |
Solución: dirección en uso, reemplazos, caché, textos y enlaces, crédito, barra final, avatar, Unsplash y bg.jpg, main.css, título |
405 |
Sección 5 | Recorrido de la solución | Pruebas y depuración | Sección 5 |
| (No existe en el curso original) | — | — | — | Sitio de la feria de ciencias | Sección 6 |
| (No existe en el curso original) | — | — | — | Portal del Grupo, etapa 3 | Sección 7 |
12. 📦 Evidencias de aprendizaje del Día 56
- La tarjeta de presentación funcionando en
/, con captura de la Consola sin errores 404 y de la vista de celular. - La lista de verificación para adoptar plantillas (Reto 4 de la sección 4).
- La tabla de códigos de estado de la pestaña Red (Reto 2 de la sección 2).
- El sitio de la feria de ciencias (proyecto extra) con
CREDITOS.md. - La etapa 3 del Portal del Grupo.
- Cuaderno de errores:
TemplateNotFound, carpeta mal nombrada, imagen fuera destatic, mayúsculas en nombres de archivos, ruta relativa en página anidada, caché, reemplazo sin barra final, cambios decontentEditableperdidos.