Asegurando Variables de Entorno en Django: Guía Completa
Introducción

Cuando desarrollamos aplicaciones web, es común trabajar con información sensible como claves API, credenciales de bases de datos y configuraciones del entorno de producción. Estas variables deben manejarse de forma segura para evitar exponer información crítica. Aquí verás cómo usar un archivo .env en Django y cómo protegerlo correctamente.

¿Qué son las variables de entorno y por qué usarlas?

Son valores externos que tu aplicación utiliza para configurarse. Permiten almacenar datos sensibles fuera del código fuente, como:

  • Claves secretas (SECRET_KEY).
  • Credenciales de bases de datos.
  • Configuraciones de servicios externos (por ejemplo, API_KEY).

Al usarlas, evitas incluir datos sensibles en el repositorio, reduciendo riesgos en proyectos públicos o compartidos.

Configuración inicial del archivo .env

Para manejar archivos .env puedes usar python-decouple o django-environ. Aquí usaremos python-decouple y, si expones DATABASE_URL, añadiremos dj-database-url para parsearlo.

Instala dependencias:

pip install python-decouple dj-database-url

Crea un archivo .env en la raíz del proyecto con información sensible:

SECRET_KEY=your-very-secure-secret-key
DEBUG=True
# Formato URL (recomendado para despliegue)
DATABASE_URL=postgres://user:password@localhost:5432/mydatabase
# Variables opcionales de servicios externos
# API_KEY=xxxxxxxxxxxxxxxx

Carga las variables en settings.py:

from decouple import config
import dj_database_url

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', cast=bool, default=False)

# Si defines DATABASE_URL en el .env, parsea la URL:
DATABASES = {
    'default': dj_database_url.parse(config('DATABASE_URL', default='sqlite:///db.sqlite3'))
}

Nota: Si prefieres variables separadas (sin URL), puedes usar:

from decouple import config

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME':   config('DB_NAME', default='mydb'),
        'USER':   config('DB_USER', default='user'),
        'PASSWORD': config('DB_PASSWORD', default=''),
        'HOST':   config('DB_HOST', default='localhost'),
        'PORT':   config('DB_PORT', default='5432'),
    }
}
Asegurar el archivo .env

El archivo .env contiene información sensible. Protégelo con estos pasos:

Añade .env al .gitignore:

# Ignorar archivos de entorno
.env
.env.local
.env.*.local

Establece permisos en el servidor para evitar accesos no autorizados:

chmod 600 .env

Verifica que no estás subiendo el archivo al repositorio:

git status

Si aparece en cambios, confirma que está listado en .gitignore. Si ya se subió por error, elimina el secreto del historial y rota las credenciales.

Buenas prácticas adicionales
  • Usa .env.example: publica solo las claves sin valores para documentar qué variables se esperan.
  • Producción: define DEBUG=False, rota SECRET_KEY si se expone y limita ALLOWED_HOSTS.
  • CI/CD y contenedores: inyecta variables como verdaderas “environment variables” del sistema/runner, no montes el .env plano si puedes evitarlo.

Ejemplo de .env.example:

# Copia este archivo a ".env" y completa los valores
SECRET_KEY=
DEBUG=False
ALLOWED_HOSTS=example.com,www.example.com
DATABASE_URL=postgres://user:password@host:5432/dbname
API_KEY=

Ejemplo de lectura de ALLOWED_HOSTS desde .env:

from decouple import config, Csv

ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='127.0.0.1,localhost', cast=Csv())

Manejar variables de entorno mediante un archivo .env (o variables del sistema) es esencial para mantener tu proyecto seguro y flexible. Con python-decouple y dj-database-url facilitas la configuración por entorno sin exponer secretos.