UNA HISTORIA DE DECISIONES COMPARTIDAS
DJANGO
CON CRITERIO
Un equipo. Una necesidad.
Una base que crece.
Acompaña el camino de un equipo de ingenierías que eligió Python y construyó una base Django replicable. Cada necesidad conduce a una decisión: organizar, proteger, publicar y mantener.
EL ORIGEN · RELATO DEL AUTOR
Cómo construimos una base que pudiera crecer con el equipo
Todo comenzó en un momento de mi vida profesional en el que, dentro del área donde trabajaba, tuvimos que decidir con qué tecnología construir nuestras soluciones. No éramos un equipo formado principalmente por desarrolladores de software. Había ingenieros electrónicos, mecánicos, químicos y profesionales de otras especialidades. En mi caso, como electrónico, había tenido la oportunidad de participar en algunos proyectos y acercarme a la programación. Esa experiencia me dio un punto desde el cual comenzar, pero la responsabilidad que teníamos delante era mayor: necesitábamos una base que pudiera servirle al equipo, no solamente a quien la escribiera.
Python resultó una elección cercana porque varios conocíamos sus fundamentos. Django nos ofrecía una estructura para llevar ese conocimiento a una aplicación web. Sin embargo, pronto entendimos que crear el proyecto y ver una página funcionando no respondía todavía a lo que nos pedían los clientes. Había que pensar en seguridad, infraestructura, arquitectura y mantenimiento. También queríamos que el trabajo quedara preparado para repetirse: que un nuevo proyecto no obligara a inventar otra vez cada decisión.
Esta historia organiza ese aprendizaje alrededor de SensorHub, una plataforma didáctica de sensores. Partimos de mi experiencia y reconstruimos un recorrido que permita comprender las decisiones del equipo. Los ejemplos conectan sus motivos; no pretenden fechar cada acontecimiento ni añadir conversaciones o incidentes personales que no se hayan relatado. Vamos a seguir la evolución de la misma aplicación, observando qué resuelve cada paso y qué pregunta permanece abierta.
77 decisiones, una historia conectada.
Abre un capítulo para ver sus pasos. Las unidades temáticas siguen disponibles más abajo para consultar un asunto puntual.
01Un equipo, una base común6 pasos del relato
Necesitábamos una tecnología que el equipo pudiera aprender y una forma de empezar que pudiera repetir.
02Del arranque a una base protegida2 pasos del relato
La primera página funcionaba; ahora había que entender y proteger las peticiones que la hacían posible.
03Cada pieza encuentra su responsabilidad11 pasos del relato
El crecimiento nos llevó a separar datos, contratos, consultas y cambios sin perder el recorrido de una petición.
- 09 PostgreSQL local y diagnóstico de conexión
- 10 Modelos base y UUID
- 11 Relaciones y reglas de integridad
- 12 Serializers de entrada y salida
- 13 CQS: consultar y ejecutar
- 14 Servicios y casos de uso
- 15 repoGenerico: la biblioteca reutilizable del equipo
- 16 Paginación desde repoGenerico: un solo contrato
- 17 ORM eficiente y consultas N+1
- 18 psycopg 3: reutilizar conexiones con un pool
- 19 UTIL_LIB: funciones puras y unidades
04Una interfaz que el equipo pueda mantener4 pasos del relato
La arquitectura también debía llegar a las pantallas y a sus componentes compartidos.
05Ver un botón no concede permiso5 pasos del relato
Al aparecer responsabilidades distintas, necesitábamos una misma política para la pantalla y el servidor.
06Los datos empiezan a llegar9 pasos del relato
La plataforma debía recibir mediciones, entender su tiempo y convertirlas en información útil.
- 29 Ingesta IoT y credenciales técnicas
- 30 Timestamps, calibración y datos históricos
- 31 ASGI y WebSockets
- 32 Alarmas como máquina de estados
- 33 Tareas, outbox y efectos externos
- 34 Históricos, filtros y decimación
- 35 Exportaciones CSV y reportes
- 36 Correo SMTP nativo después del commit
- 37 Pruebas de comportamiento
07La identidad sale del equipo8 pasos del relato
Al integrar la organización, hubo que decidir cómo iniciar sesión, separar entornos y delegar acceso.
- 38 Identidades separadas para DEV y PROD
- 39 Convenciones de nombres y ciclo de vida
- 40 Zero Trust: identidad, acceso y autorización
- 41 MSAL propio en DEV y PROD: registro y callback
- 42 Easy Auth: autenticación antes de Django
- 43 Configurar Easy Auth por App Service
- 44 Delegación de invitados y acceso a una aplicación
- 45 Usuarios externos y costos por MAU
08La base de datos también tiene fronteras7 pasos del relato
Publicar requería decidir quién podía leer, modificar, migrar y recuperar los datos.
- 46 Gobernanza de base de datos y mínimo privilegio
- 47 Roles de runtime, migración y consulta
- 48 Aislar producción, staging y bases de desarrollo
- 49 Migraciones y permisos para tablas futuras
- 50 pgAdmin y acceso temporal verificable
- 51 psql: conexión segura y checklist de permisos
- 52 Backup y restauración ensayada con pgAdmin
09El mismo proyecto llega a Azure15 pasos del relato
Una entrega repetible conecta infraestructura, configuración, servidor, paquete y verificación.
- 53 Azure: recursos, App Service y plan
- 54 PostgreSQL Flexible Server: capacidad y costo inicial
- 55 IAM de Azure: quién puede operar cada recurso
- 56 Variables de producción y contrato de configuración
- 57 Comando de arranque: Gunicorn o Daphne
- 58 Archivos estáticos: collectstatic y WhiteNoise
- 59 deploy.zip: carpeta del proyecto y estáticos preparados
- 60 Herramientas avanzadas: carga manual y ZIP alojado
- 61 Publicar desde PowerShell con Azure CLI
- 62 Publicar Django: slots, CI y ZIP Deploy
- 63 Dominios personalizados, DNS y TLS
- 64 Endurecer Django detrás de un proxy
- 65 Seguridad en production.py: HTTPS, proxy y HSTS
- 66 Despliegue, salud y observabilidad
- 67 Ciclo de entrega: verificar, promover y recuperar
10Operar también es desarrollar9 pasos del relato
Con el servicio funcionando, el equipo asume consumo, vulnerabilidades, almacenamiento y continuidad.
- 68 Application Insights: observar y controlar consumo
- 69 Infraestructura de un servidor LoRa en Azure
- 70 Optimizar costos de VM sin perder recuperación
- 71 DevSecOps y SCA sobre el inventario real
- 72 Trazabilidad de vulnerabilidades y cierre verificable
- 73 Kudu y diagnóstico de cuota de almacenamiento
- 74 Cachés y despliegues limpios
- 75 Mantenimiento con retención y recuperación
- 76 Reducir el plan: diagnóstico Bx a F1
11Volver a empezar con una base mejor1 pasos del relato
El resultado es una base replicable y un criterio que podemos aplicar al siguiente proyecto.
ISLA DJANGO · MUNDO 01
Aprende CQS jugando.
Acompaña a Byte por cinco estaciones y decide qué debe hacer cada petición.
Tres misiones: consultar, crear y rechazar una entrada inválida. Se puede jugar con ratón, controles táctiles o teclado.
EL TALLER DE SENSORHUB
Primero, mira el conjunto.
De una medición al servicio que la convierte en información útil.
11 ESPACIOS PARA APRENDER
Entra al taller por un tema.
Reconoce cada unidad por su imagen y explora sus lecciones.

Fundamentos y arquitectura
Del requisito a un modelo con reglas claras.
Explorar →
APIs y casos de uso
Contratos, CQS, reutilización y consultas eficientes.
Explorar →
Composición y frontend
Mixins, templates, JavaScript y capacidades.
Explorar →
Seguridad y consistencia
Permisos, identidad, transacciones y cálculos.
Explorar →
Datos y tiempo real
Ingesta, WebSockets, alarmas e históricos.
Explorar →
Entrega profesional
Reportes, pruebas, operación y proyecto final.
Explorar →
Identidad empresarial en Azure
Entra ID, MSAL, Easy Auth, delegación y licenciamiento.
Explorar →
Azure y Django: configuración y despliegue
Entornos, variables, arranque, estáticos, PowerShell, Kudu y ciclo de entrega.
Explorar →
Operación y DevSecOps
Telemetría, infraestructura IoT, costos, correo y vulnerabilidades.
Explorar →
Gobernanza de PostgreSQL
Roles, mínimo privilegio, migraciones, pgAdmin y acceso verificable.
Explorar →
Mantenimiento de App Service
Kudu, cuotas, cachés, despliegues limpios y cambios de plan.
Explorar →UNA RUTA, 11 UNIDADES
Aprende tema a tema.

Diseñar antes de programar
Transforma una idea en módulos, casos de uso y reglas verificables.
Aprender este tema ↗
Preparar el proyecto y el entorno
Crea una base reproducible para trabajar en Windows o Linux.
Aprender este tema ↗
Git y VS Code: incorporarse al proyecto
Clona, aísla tu trabajo y entrega cambios revisables.
Aprender este tema ↗
Apps y dependencias
Organiza funcionalidades y mantén imports comprensibles.
Aprender este tema ↗
Settings: base.py, development.py y production.py
Compón la configuración común y selecciona el entorno al iniciar el proceso.
Aprender este tema ↗
Variables locales: .env y configuración tipada
Carga valores locales antes de importar base.py y valida su forma.
Aprender este tema ↗
Sesión, CSRF y middleware
Entiende el ciclo de identidad y la protección de escrituras del navegador.
Aprender este tema ↗
Seguridad en base.py: cookies, CSRF y cabeceras
Declara las defensas comunes y comprueba qué depende de cada middleware.
Aprender este tema ↗
PostgreSQL local y diagnóstico de conexión
Practica con una base aislada antes de usar datos o credenciales de producción.
Aprender este tema ↗
Modelos base y UUID
Comparte identidad y timestamps sin crear tablas innecesarias.
Aprender este tema ↗
Relaciones y reglas de integridad
Modela el catálogo con restricciones que sobreviven a cualquier interfaz.
Aprender este tema ↗
Serializers de entrada y salida
Convierte la frontera HTTP en un contrato explícito.
Aprender este tema ↗
CQS: consultar y ejecutar
Separa Queries y Commands sin añadir infraestructura innecesaria.
Aprender este tema ↗
Servicios y casos de uso
Extrae lógica de negocio que necesita reutilización y pruebas propias.
Aprender este tema ↗
repoGenerico: la biblioteca reutilizable del equipo
Convierte los flujos repetidos de DRF en una base común para tus aplicaciones y proyectos.
Aprender este tema ↗
Paginación desde repoGenerico: un solo contrato
Todas las tablas reutilizan el mismo flujo; cada Query aporta filtros, orden y alcance.
Aprender este tema ↗
ORM eficiente y consultas N+1
Diseña queryset y serializer como una sola operación de lectura.
Aprender este tema ↗
psycopg 3: reutilizar conexiones con un pool
Limita conexiones simultáneas sin confundir pooling con optimización de consultas.
Aprender este tema ↗
UTIL_LIB: funciones puras y unidades
Reutiliza cálculos sin acoplarlos a vistas, ORM o frontend.
Aprender este tema ↗
Mixins, MRO y super()
Compón comportamientos transversales sin duplicar clases completas.
Aprender este tema ↗
Templates, includes y context processors
Construye una interfaz modular con contexto bien delimitado.
Aprender este tema ↗
Frontend modular y estado explícito
Separa acceso a datos, estado y render en JavaScript.
Aprender este tema ↗
Cliente API compartido y errores
Centraliza fetch para que todos los módulos manejen errores igual.
Aprender este tema ↗
Política central de roles y capacidades
Define permisos en un lugar y reutilízalos en API y frontend.
Aprender este tema ↗
Permisos de frontend y protección de API
Usa la misma política para orientar la UI y exigir acceso en el servidor.
Aprender este tema ↗
Identidad externa y MSAL
Integra un proveedor de identidad sin mezclarlo con reglas del negocio.
Aprender este tema ↗
Auditoría y trazabilidad
Registra eventos de negocio útiles para reconstruir acciones.
Aprender este tema ↗
Transacciones e idempotencia
Protege operaciones frente a repetición y concurrencia.
Aprender este tema ↗
Ingesta IoT y credenciales técnicas
Diseña la entrada de datos de dispositivos como una frontera propia.
Aprender este tema ↗
Timestamps, calibración y datos históricos
Conserva el contexto de la medida y distingue ocurrencia de recepción.
Aprender este tema ↗
ASGI y WebSockets
Publica cambios en tiempo real sin mezclar canales ni permisos.
Aprender este tema ↗
Alarmas como máquina de estados
Evita notificaciones repetidas ante una condición persistente.
Aprender este tema ↗
Tareas, outbox y efectos externos
Separa el guardado de datos de la entrega durable de notificaciones.
Aprender este tema ↗
Históricos, filtros y decimación
Reduce datos para gráficos sin confundir visualización con cálculo.
Aprender este tema ↗
Exportaciones CSV y reportes
Genera salidas consistentes con el dato histórico y el contrato de acceso.
Aprender este tema ↗
Correo SMTP nativo después del commit
EmailMultiAlternatives, secretos, destinatarios autorizados y límites de entrega.
Aprender este tema ↗
Pruebas de comportamiento
Verifica invariantes y contratos, no solamente líneas ejecutadas.
Aprender este tema ↗
Identidades separadas para DEV y PROD
App Registration, Enterprise Application y aislamiento por proyecto y entorno.
Aprender este tema ↗
Convenciones de nombres y ciclo de vida
Nombres legibles, identificadores estables y gobierno de aplicaciones.
Aprender este tema ↗
Zero Trust: identidad, acceso y autorización
B2B, MFA, asignación empresarial, RBAC interno y auditoría como controles complementarios.
Aprender este tema ↗
MSAL propio en DEV y PROD: registro y callback
Deja que Django gestione el flujo MSAL con una URI de retorno coherente por entorno.
Aprender este tema ↗
Easy Auth: autenticación antes de Django
Cómo delegar el ingreso a App Service y conservar permisos de negocio en el backend.
Aprender este tema ↗
Configurar Easy Auth por App Service
Proveedor Microsoft, callback, tenant y pruebas de acceso por entorno.
Aprender este tema ↗
Delegación de invitados y acceso a una aplicación
Guest Inviter, propietario de aplicación y separación de responsabilidades.
Aprender este tema ↗
Usuarios externos y costos por MAU
Estimar usuarios activos mensuales sin confundirlos con conexiones o cuentas creadas.
Aprender este tema ↗
Gobernanza de base de datos y mínimo privilegio
Separar administración Azure, acceso PostgreSQL y autorización de negocio.
Aprender este tema ↗
Roles de runtime, migración y consulta
LOGIN, NOLOGIN, propiedad, membresías y privilegios explícitos.
Aprender este tema ↗
Aislar producción, staging y bases de desarrollo
CONNECT, esquemas, PUBLIC y credenciales separadas por entorno.
Aprender este tema ↗
Migraciones y permisos para tablas futuras
Propietario efectivo, ALTER DEFAULT PRIVILEGES y separación del runtime.
Aprender este tema ↗
pgAdmin y acceso temporal verificable
Interfaz gráfica, DB restriction, permisos acumulados y retiro de acceso.
Aprender este tema ↗
psql: conexión segura y checklist de permisos
Host, TLS, identidad efectiva y pruebas positivas y negativas.
Aprender este tema ↗
Backup y restauración ensayada con pgAdmin
Comprueba que una copia permite recuperar datos y acceso en una base aislada.
Aprender este tema ↗
Azure: recursos, App Service y plan
Ubica el código, la capacidad de cómputo y la identidad en recursos distintos.
Aprender este tema ↗
PostgreSQL Flexible Server: capacidad y costo inicial
Conecta la experiencia de cuatro IoT con una capacidad que se mide y un costo que se cotiza.
Aprender este tema ↗
IAM de Azure: quién puede operar cada recurso
Azure RBAC, identidades de despliegue y permisos con alcance mínimo.
Aprender este tema ↗
Variables de producción y contrato de configuración
Traslada nombres de configuración a Azure sin subir el .env.
Aprender este tema ↗
Comando de arranque: Gunicorn o Daphne
Elige el servidor por el protocolo de la aplicación y verifica su ruta de importación.
Aprender este tema ↗
Archivos estáticos: collectstatic y WhiteNoise
Distingue fuentes estáticas, salida de construcción y archivos subidos por usuarios.
Aprender este tema ↗
deploy.zip: carpeta del proyecto y estáticos preparados
Reproduce el paquete manual del equipo y ajusta el arranque a su estructura.
Aprender este tema ↗
Herramientas avanzadas: carga manual y ZIP alojado
Distingue una carga de archivos de una operación de despliegue y verifica su resultado.
Aprender este tema ↗
Publicar desde PowerShell con Azure CLI
Autentica al operador, verifica el destino y publica el ZIP preparado.
Aprender este tema ↗
Publicar Django: slots, CI y ZIP Deploy
Elegir una estrategia con artefactos reproducibles, verificación y rollback.
Aprender este tema ↗
Dominios personalizados, DNS y TLS
Asociar un dominio al App Service y verificar transporte y callbacks.
Aprender este tema ↗
Endurecer Django detrás de un proxy
HTTPS, HSTS, cookies, CSRF, cabeceras y secretos con comprobación efectiva.
Aprender este tema ↗
Seguridad en production.py: HTTPS, proxy y HSTS
Activa las defensas de transporte y verifica la configuración real del despliegue.
Aprender este tema ↗
Despliegue, salud y observabilidad
Lleva el proyecto al servidor con configuración y señales operativas claras.
Aprender este tema ↗
Ciclo de entrega: verificar, promover y recuperar
Une código, configuración, migraciones y observación en una entrega repetible.
Aprender este tema ↗
Application Insights: observar y controlar consumo
Ingesta, retención, KQL, sampling y límites sin perder visibilidad.
Aprender este tema ↗
Infraestructura de un servidor LoRa en Azure
VM, disco, VNet, NIC, NSG, entrada, diagnóstico y restauración.
Aprender este tema ↗
Optimizar costos de VM sin perder recuperación
Desasignación, discos, backups, red y comparación de escenarios.
Aprender este tema ↗
DevSecOps y SCA sobre el inventario real
Dependencias directas y transitivas, advisories y priorización por riesgo.
Aprender este tema ↗
Trazabilidad de vulnerabilidades y cierre verificable
Del hallazgo técnico a la actualización, validación y comunicación accionable.
Aprender este tema ↗
Kudu y diagnóstico de cuota de almacenamiento
Medir /home, distinguir espacios y localizar el crecimiento antes de limpiar.
Aprender este tema ↗
Cachés y despliegues limpios
Qué hace --clean, qué deja fuera y dónde se construyen las dependencias.
Aprender este tema ↗
Mantenimiento con retención y recuperación
Limpiar lo regenerable, conservar evidencia y proteger el despliegue activo.
Aprender este tema ↗
Reducir el plan: diagnóstico Bx a F1
Cuota, compatibilidad de funcionalidades, capacidad regional y plan de reversión.
Aprender este tema ↗
Proyecto final: conectar todas las piezas
Construye una funcionalidad vertical y justifica cada responsabilidad.
Aprender este tema ↗Así se estudia este curso
En cada tema encontrarás una explicación conceptual, decisiones de diseño, pasos de implementación, código propio y un ejercicio con solución. Los ejemplos pertenecen a SensorHub; los fragmentos marcados como esquema explican un contrato y requieren completar sus dependencias.
Esta web es una academia pública. Las lecciones de identidad y permisos enseñan cómo proteger tus aplicaciones; no necesitas iniciar sesión para leerlas.