D/ DJANGO CON CRITERIO

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.

11 unidades77 leccionesEjemplos en Python y JavaScript

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.

  1. 01 Diseñar antes de programar
  2. 02 Preparar el proyecto y el entorno
  3. 03 Git y VS Code: incorporarse al proyecto
  4. 04 Apps y dependencias
  5. 05 Settings: base.py, development.py y production.py
  6. 06 Variables locales: .env y configuración tipada
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.

  1. 07 Sesión, CSRF y middleware
  2. 08 Seguridad en base.py: cookies, CSRF y cabeceras
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.

  1. 09 PostgreSQL local y diagnóstico de conexión
  2. 10 Modelos base y UUID
  3. 11 Relaciones y reglas de integridad
  4. 12 Serializers de entrada y salida
  5. 13 CQS: consultar y ejecutar
  6. 14 Servicios y casos de uso
  7. 15 repoGenerico: la biblioteca reutilizable del equipo
  8. 16 Paginación desde repoGenerico: un solo contrato
  9. 17 ORM eficiente y consultas N+1
  10. 18 psycopg 3: reutilizar conexiones con un pool
  11. 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.

  1. 20 Mixins, MRO y super()
  2. 21 Templates, includes y context processors
  3. 22 Frontend modular y estado explícito
  4. 23 Cliente API compartido y errores
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.

  1. 24 Política central de roles y capacidades
  2. 25 Permisos de frontend y protección de API
  3. 26 Identidad externa y MSAL
  4. 27 Auditoría y trazabilidad
  5. 28 Transacciones e idempotencia
06Los datos empiezan a llegar9 pasos del relato

La plataforma debía recibir mediciones, entender su tiempo y convertirlas en información útil.

  1. 29 Ingesta IoT y credenciales técnicas
  2. 30 Timestamps, calibración y datos históricos
  3. 31 ASGI y WebSockets
  4. 32 Alarmas como máquina de estados
  5. 33 Tareas, outbox y efectos externos
  6. 34 Históricos, filtros y decimación
  7. 35 Exportaciones CSV y reportes
  8. 36 Correo SMTP nativo después del commit
  9. 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.

  1. 38 Identidades separadas para DEV y PROD
  2. 39 Convenciones de nombres y ciclo de vida
  3. 40 Zero Trust: identidad, acceso y autorización
  4. 41 MSAL propio en DEV y PROD: registro y callback
  5. 42 Easy Auth: autenticación antes de Django
  6. 43 Configurar Easy Auth por App Service
  7. 44 Delegación de invitados y acceso a una aplicación
  8. 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.

  1. 46 Gobernanza de base de datos y mínimo privilegio
  2. 47 Roles de runtime, migración y consulta
  3. 48 Aislar producción, staging y bases de desarrollo
  4. 49 Migraciones y permisos para tablas futuras
  5. 50 pgAdmin y acceso temporal verificable
  6. 51 psql: conexión segura y checklist de permisos
  7. 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.

  1. 53 Azure: recursos, App Service y plan
  2. 54 PostgreSQL Flexible Server: capacidad y costo inicial
  3. 55 IAM de Azure: quién puede operar cada recurso
  4. 56 Variables de producción y contrato de configuración
  5. 57 Comando de arranque: Gunicorn o Daphne
  6. 58 Archivos estáticos: collectstatic y WhiteNoise
  7. 59 deploy.zip: carpeta del proyecto y estáticos preparados
  8. 60 Herramientas avanzadas: carga manual y ZIP alojado
  9. 61 Publicar desde PowerShell con Azure CLI
  10. 62 Publicar Django: slots, CI y ZIP Deploy
  11. 63 Dominios personalizados, DNS y TLS
  12. 64 Endurecer Django detrás de un proxy
  13. 65 Seguridad en production.py: HTTPS, proxy y HSTS
  14. 66 Despliegue, salud y observabilidad
  15. 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.

  1. 68 Application Insights: observar y controlar consumo
  2. 69 Infraestructura de un servidor LoRa en Azure
  3. 70 Optimizar costos de VM sin perder recuperación
  4. 71 DevSecOps y SCA sobre el inventario real
  5. 72 Trazabilidad de vulnerabilidades y cierre verificable
  6. 73 Kudu y diagnóstico de cuota de almacenamiento
  7. 74 Cachés y despliegues limpios
  8. 75 Mantenimiento con retención y recuperación
  9. 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.

  1. 77 Proyecto final: conectar todas las piezas

ISLA DJANGO · MUNDO 01

Aprende CQS jugando.

Acompaña a Byte por cinco estaciones y decide qué debe hacer cada petición.

Abrir aventura a pantalla completa ↗

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.

Arquitectura SensorHub: frontend, acceso y dispositivos se relacionan con casos de uso, persistencia y operación.
Las flechas relacionan responsabilidades. La ingesta valida los datos antes de persistirlos; los permisos se aplican en el backend. Operación despliega y observa el conjunto.
Relación entre componentes Una responsabilidad con límitesVer el proyecto completo →

11 ESPACIOS PARA APRENDER

Entra al taller por un tema.

Reconoce cada unidad por su imagen y explora sus lecciones.

UNA RUTA, 11 UNIDADES

Aprende tema a tema.

UNIDAD 101

Diseñar antes de programar

Transforma una idea en módulos, casos de uso y reglas verificables.

Aprender este tema ↗
UNIDAD 102

Preparar el proyecto y el entorno

Crea una base reproducible para trabajar en Windows o Linux.

Aprender este tema ↗
UNIDAD 103

Git y VS Code: incorporarse al proyecto

Clona, aísla tu trabajo y entrega cambios revisables.

Aprender este tema ↗
UNIDAD 104

Apps y dependencias

Organiza funcionalidades y mantén imports comprensibles.

Aprender este tema ↗
UNIDAD 105

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 ↗
UNIDAD 106

Variables locales: .env y configuración tipada

Carga valores locales antes de importar base.py y valida su forma.

Aprender este tema ↗
UNIDAD 407

Sesión, CSRF y middleware

Entiende el ciclo de identidad y la protección de escrituras del navegador.

Aprender este tema ↗
UNIDAD 408

Seguridad en base.py: cookies, CSRF y cabeceras

Declara las defensas comunes y comprueba qué depende de cada middleware.

Aprender este tema ↗
UNIDAD 109

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 ↗
UNIDAD 110

Modelos base y UUID

Comparte identidad y timestamps sin crear tablas innecesarias.

Aprender este tema ↗
UNIDAD 111

Relaciones y reglas de integridad

Modela el catálogo con restricciones que sobreviven a cualquier interfaz.

Aprender este tema ↗
UNIDAD 212

Serializers de entrada y salida

Convierte la frontera HTTP en un contrato explícito.

Aprender este tema ↗
UNIDAD 213

CQS: consultar y ejecutar

Separa Queries y Commands sin añadir infraestructura innecesaria.

Aprender este tema ↗
UNIDAD 214

Servicios y casos de uso

Extrae lógica de negocio que necesita reutilización y pruebas propias.

Aprender este tema ↗
UNIDAD 215

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 ↗
UNIDAD 216

Paginación desde repoGenerico: un solo contrato

Todas las tablas reutilizan el mismo flujo; cada Query aporta filtros, orden y alcance.

Aprender este tema ↗
UNIDAD 217

ORM eficiente y consultas N+1

Diseña queryset y serializer como una sola operación de lectura.

Aprender este tema ↗
UNIDAD 218

psycopg 3: reutilizar conexiones con un pool

Limita conexiones simultáneas sin confundir pooling con optimización de consultas.

Aprender este tema ↗
UNIDAD 419

UTIL_LIB: funciones puras y unidades

Reutiliza cálculos sin acoplarlos a vistas, ORM o frontend.

Aprender este tema ↗
UNIDAD 320

Mixins, MRO y super()

Compón comportamientos transversales sin duplicar clases completas.

Aprender este tema ↗
UNIDAD 321

Templates, includes y context processors

Construye una interfaz modular con contexto bien delimitado.

Aprender este tema ↗
UNIDAD 322

Frontend modular y estado explícito

Separa acceso a datos, estado y render en JavaScript.

Aprender este tema ↗
UNIDAD 323

Cliente API compartido y errores

Centraliza fetch para que todos los módulos manejen errores igual.

Aprender este tema ↗
UNIDAD 324

Política central de roles y capacidades

Define permisos en un lugar y reutilízalos en API y frontend.

Aprender este tema ↗
UNIDAD 425

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 ↗
UNIDAD 426

Identidad externa y MSAL

Integra un proveedor de identidad sin mezclarlo con reglas del negocio.

Aprender este tema ↗
UNIDAD 427

Auditoría y trazabilidad

Registra eventos de negocio útiles para reconstruir acciones.

Aprender este tema ↗
UNIDAD 428

Transacciones e idempotencia

Protege operaciones frente a repetición y concurrencia.

Aprender este tema ↗
UNIDAD 529

Ingesta IoT y credenciales técnicas

Diseña la entrada de datos de dispositivos como una frontera propia.

Aprender este tema ↗
UNIDAD 530

Timestamps, calibración y datos históricos

Conserva el contexto de la medida y distingue ocurrencia de recepción.

Aprender este tema ↗
UNIDAD 531

ASGI y WebSockets

Publica cambios en tiempo real sin mezclar canales ni permisos.

Aprender este tema ↗
UNIDAD 532

Alarmas como máquina de estados

Evita notificaciones repetidas ante una condición persistente.

Aprender este tema ↗
UNIDAD 533

Tareas, outbox y efectos externos

Separa el guardado de datos de la entrega durable de notificaciones.

Aprender este tema ↗
UNIDAD 534

Históricos, filtros y decimación

Reduce datos para gráficos sin confundir visualización con cálculo.

Aprender este tema ↗
UNIDAD 635

Exportaciones CSV y reportes

Genera salidas consistentes con el dato histórico y el contrato de acceso.

Aprender este tema ↗
UNIDAD 936

Correo SMTP nativo después del commit

EmailMultiAlternatives, secretos, destinatarios autorizados y límites de entrega.

Aprender este tema ↗
UNIDAD 637

Pruebas de comportamiento

Verifica invariantes y contratos, no solamente líneas ejecutadas.

Aprender este tema ↗
UNIDAD 738

Identidades separadas para DEV y PROD

App Registration, Enterprise Application y aislamiento por proyecto y entorno.

Aprender este tema ↗
UNIDAD 739

Convenciones de nombres y ciclo de vida

Nombres legibles, identificadores estables y gobierno de aplicaciones.

Aprender este tema ↗
UNIDAD 740

Zero Trust: identidad, acceso y autorización

B2B, MFA, asignación empresarial, RBAC interno y auditoría como controles complementarios.

Aprender este tema ↗
UNIDAD 741

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 ↗
UNIDAD 742

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 ↗
UNIDAD 743

Configurar Easy Auth por App Service

Proveedor Microsoft, callback, tenant y pruebas de acceso por entorno.

Aprender este tema ↗
UNIDAD 744

Delegación de invitados y acceso a una aplicación

Guest Inviter, propietario de aplicación y separación de responsabilidades.

Aprender este tema ↗
UNIDAD 745

Usuarios externos y costos por MAU

Estimar usuarios activos mensuales sin confundirlos con conexiones o cuentas creadas.

Aprender este tema ↗
UNIDAD 1046

Gobernanza de base de datos y mínimo privilegio

Separar administración Azure, acceso PostgreSQL y autorización de negocio.

Aprender este tema ↗
UNIDAD 1047

Roles de runtime, migración y consulta

LOGIN, NOLOGIN, propiedad, membresías y privilegios explícitos.

Aprender este tema ↗
UNIDAD 1048

Aislar producción, staging y bases de desarrollo

CONNECT, esquemas, PUBLIC y credenciales separadas por entorno.

Aprender este tema ↗
UNIDAD 1049

Migraciones y permisos para tablas futuras

Propietario efectivo, ALTER DEFAULT PRIVILEGES y separación del runtime.

Aprender este tema ↗
UNIDAD 1050

pgAdmin y acceso temporal verificable

Interfaz gráfica, DB restriction, permisos acumulados y retiro de acceso.

Aprender este tema ↗
UNIDAD 1051

psql: conexión segura y checklist de permisos

Host, TLS, identidad efectiva y pruebas positivas y negativas.

Aprender este tema ↗
UNIDAD 1052

Backup y restauración ensayada con pgAdmin

Comprueba que una copia permite recuperar datos y acceso en una base aislada.

Aprender este tema ↗
UNIDAD 853

Azure: recursos, App Service y plan

Ubica el código, la capacidad de cómputo y la identidad en recursos distintos.

Aprender este tema ↗
UNIDAD 854

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 ↗
UNIDAD 855

IAM de Azure: quién puede operar cada recurso

Azure RBAC, identidades de despliegue y permisos con alcance mínimo.

Aprender este tema ↗
UNIDAD 856

Variables de producción y contrato de configuración

Traslada nombres de configuración a Azure sin subir el .env.

Aprender este tema ↗
UNIDAD 857

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 ↗
UNIDAD 858

Archivos estáticos: collectstatic y WhiteNoise

Distingue fuentes estáticas, salida de construcción y archivos subidos por usuarios.

Aprender este tema ↗
UNIDAD 859

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 ↗
UNIDAD 860

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 ↗
UNIDAD 861

Publicar desde PowerShell con Azure CLI

Autentica al operador, verifica el destino y publica el ZIP preparado.

Aprender este tema ↗
UNIDAD 862

Publicar Django: slots, CI y ZIP Deploy

Elegir una estrategia con artefactos reproducibles, verificación y rollback.

Aprender este tema ↗
UNIDAD 863

Dominios personalizados, DNS y TLS

Asociar un dominio al App Service y verificar transporte y callbacks.

Aprender este tema ↗
UNIDAD 864

Endurecer Django detrás de un proxy

HTTPS, HSTS, cookies, CSRF, cabeceras y secretos con comprobación efectiva.

Aprender este tema ↗
UNIDAD 865

Seguridad en production.py: HTTPS, proxy y HSTS

Activa las defensas de transporte y verifica la configuración real del despliegue.

Aprender este tema ↗
UNIDAD 666

Despliegue, salud y observabilidad

Lleva el proyecto al servidor con configuración y señales operativas claras.

Aprender este tema ↗
UNIDAD 867

Ciclo de entrega: verificar, promover y recuperar

Une código, configuración, migraciones y observación en una entrega repetible.

Aprender este tema ↗
UNIDAD 968

Application Insights: observar y controlar consumo

Ingesta, retención, KQL, sampling y límites sin perder visibilidad.

Aprender este tema ↗
UNIDAD 969

Infraestructura de un servidor LoRa en Azure

VM, disco, VNet, NIC, NSG, entrada, diagnóstico y restauración.

Aprender este tema ↗
UNIDAD 970

Optimizar costos de VM sin perder recuperación

Desasignación, discos, backups, red y comparación de escenarios.

Aprender este tema ↗
UNIDAD 971

DevSecOps y SCA sobre el inventario real

Dependencias directas y transitivas, advisories y priorización por riesgo.

Aprender este tema ↗
UNIDAD 972

Trazabilidad de vulnerabilidades y cierre verificable

Del hallazgo técnico a la actualización, validación y comunicación accionable.

Aprender este tema ↗
UNIDAD 1173

Kudu y diagnóstico de cuota de almacenamiento

Medir /home, distinguir espacios y localizar el crecimiento antes de limpiar.

Aprender este tema ↗
UNIDAD 1174

Cachés y despliegues limpios

Qué hace --clean, qué deja fuera y dónde se construyen las dependencias.

Aprender este tema ↗
UNIDAD 1175

Mantenimiento con retención y recuperación

Limpiar lo regenerable, conservar evidencia y proteger el despliegue activo.

Aprender este tema ↗
UNIDAD 1176

Reducir el plan: diagnóstico Bx a F1

Cuota, compatibilidad de funcionalidades, capacidad regional y plan de reversión.

Aprender este tema ↗
UNIDAD 677

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.