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.
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.
.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'),
}
}
.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.
- Usa
.env.example: publica solo las claves sin valores para documentar qué variables se esperan. - Producción: define
DEBUG=False, rotaSECRET_KEYsi se expone y limitaALLOWED_HOSTS. - CI/CD y contenedores: inyecta variables como verdaderas “environment variables” del sistema/runner, no montes el
.envplano 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.