D/ DJANGO CON CRITERIO

UNIDAD 1 · FUNDAMENTOS Y ARQUITECTURA

Variables locales: .env y configuración tipada

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

Ilustración: El panel de configuración
El panel de configuración

CAPÍTULO 1 · Un equipo, una base común

Lo que cambia entre máquinas no tiene que cambiar el código

Separar los archivos de configuración hizo visible qué pertenece a cada entorno, pero no resolvió por sí solo cómo entregar una contraseña o un hostname. Podríamos escribirlos en production.py, aunque entonces compartir el código implicaría compartir información que no todos necesitan conocer. También obligaría a modificar archivos cada vez que cambie el destino.

Establecemos un contrato de variables: qué nombre lee el proyecto, qué significa y cuándo es obligatorio. En el PC podemos usar un .env con carga explícita; en el servidor los valores llegarán al proceso desde su configuración. Los textos deben convertirse al tipo esperado. Una cadena que dice False no puede tratarse descuidadamente como si ya fuera un booleano.

La ausencia de un valor requerido debe descubrirse de forma clara, sin imprimir el secreto para diagnosticarla. Ya tenemos una aplicación que puede cambiar de entorno conservando su código. Antes de darle datos y funciones, necesitamos entender qué sucede cuando una petición entra: ahí se apoyarán tanto el comportamiento normal como las protecciones que vamos a compartir.

Leer esta parte dentro del relato completo →

DEL RELATO A LA PRÁCTICA

Vamos a desarrollar esta decisión con su mapa, explicación, código y ejercicio.

LABORATORIO DE CONFIGURACIÓN

Prepara tu estación de despliegue

Cambia el entorno, el servidor y la identidad para comparar sus responsabilidades.

Isla con servidores y una llave

Simulación didáctica. Los valores son ejemplos: no crea recursos, no inicia sesión ni publica archivos. Sin JavaScript, consulta la tabla y los pasos de la lección.

MIRA · CONECTA · COMPRENDE

El panel de configuración

El panel de configuración1. Archivo local: Define valores de práctica; 2. Cargador: Lee antes de importar base; 3. Tipos: Convierte y valida entradas; 4. Django: Usa configuración efectiva01Archivo localDefine valores de práctica02CargadorLee antes de importar base03TiposConvierte y valida entradas04DjangoUsa configuración efectiva

Las flechas resumen el recorrido conceptual. Los controles y dependencias se detallan debajo.

Selecciona una pieza para destacar su responsabilidad.

Leer la explicación del mapa
  1. Archivo local. Define valores de práctica
  2. Cargador. Lee antes de importar base
  3. Tipos. Convierte y valida entradas
  4. Django. Usa configuración efectiva
Descargar gráfico SVG ↓

¿Para qué sirve?

Un .env guardado junto al código no cambia os.environ por sí solo. También es fácil interpretar la cadena False como un booleano verdadero.

El concepto, explicado

El proceso recibe variables del sistema o de su lanzador. python-dotenv es un cargador opcional para desarrollo; se instala en el entorno y se ejecuta explícitamente. En este ejemplo development.py carga .env antes de importar base.py.

load_dotenv con override=False respeta las variables ya definidas en la terminal. Así puedes probar una configuración sin editar el archivo. Usa comillas según la sintaxis del cargador cuando haya espacios o #; no existe una regla general de prohibir comillas.

El código común lee nombres estables: SECRET_KEY, DB_HOST, DB_NAME, DB_USER, DB_PASSWORD y DB_PORT. Los valores cambian por entorno. .env.example documenta el contrato con valores ficticios. .env, dumps y tokens quedan fuera de Git y del paquete.

Los ejemplos de SensorHub enseñan una aplicación empresarial. La academia distribuida sigue arrancando con SQLite y sus dependencias actuales; añadir este cargador al proyecto de práctica requiere instalar python-dotenv.

Implementación paso a paso

  1. Instala python-dotenv en el proyecto de práctica y registra la dependencia revisada.
  2. Crea .env.example con valores ficticios y añade .env a .gitignore.
  3. Carga .env desde development.py antes de importar base.
  4. Convierte números, listas y booleanos explícitamente.
  5. Comprueba el entorno efectivo sin imprimir claves.

Ejemplo en SensorHub

# config/settings/development.py (proyecto de práctica)
from pathlib import Path
from dotenv import load_dotenv
load_dotenv(Path(__file__).resolve().parents[2] / ".env", override=False)
from .base import *
DEBUG = True
ALLOWED_HOSTS = ["localhost", "127.0.0.1"]

# Fragmento de base.py: variables de ejemplo
import os
DB_PORT = int(os.getenv("DB_PORT", "5432"))
USE_EASYAUTH = os.getenv("USE_EASYAUTH", "false").strip().lower() == "true"

# .env.example (archivo independiente)
# SECRET_KEY="reemplazar-solo-en-tu-env-local"
# DB_HOST=127.0.0.1
# DB_PORT=5432
# USE_EASYAUTH=false

# .gitignore: archivo independiente
# .env
# .venv/
# venv/
# *.dump
# db.sqlite3

Cómo leer el ejemplo

  • parents[2] apunta a la raíz para config/settings/development.py.
  • bool("False") devuelve True; comparar el texto normalizado evita ese error.
  • USE_EASYAUTH es una convención de nuestra aplicación, no una opción que configure Azure automáticamente.

Error habitual

Cambiar .env después de iniciar el proceso no garantiza recarga. Reinicia y no registres os.environ completo en los logs.

05 / PRACTICAR

Tu turno

Define DB_PORT en .env y un valor distinto en PowerShell. ¿Cuál gana?

Ver solución orientativa

Con override=False gana la variable ya exportada por la terminal. Elimina esa variable de la sesión para volver al valor del archivo.

Cómo sabes que funciona

  • El cargador precede a la lectura de valores.
  • False se interpreta como falso y falta de SECRET_KEY en PROD detiene el arranque.

Para profundizar

Documentación oficial para comprobar configuración, permisos y condiciones vigentes. Revisión del tema: 11 de octubre de 2026.

CONTINUAR LA EXPERIENCIA

El siguiente paso del recorrido:

Sesión, CSRF y middleware →Continuar en modo relato