Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Configuración Desarrollo con el framework Django

Imagina que ya llevas un buen rato desarrollando tu aplicación en Django y ahora necesitas conectarte a una base de datos remota, enviar correos electrónicos o integrar pagos. Para eso, necesitas guardar configuraciones como credenciales y claves de manera segura.

En este tema veremos cómo y dónde guardar esa configuración de forma segura y flexible.


¿Qué es la configuración de una aplicación?

Cuando una aplicación interactúa con el mundo exterior (por ejemplo, accede a una base de datos, envía correos o usa APIs de terceros), necesita ciertos parámetros:

  • Contraseñas
  • Claves secretas
  • URLs de servicios externos
  • Puertos y direcciones IP

Todo eso no debe estar incrustado directamente en el código fuente del proyecto. En vez de eso, se recomienda separarlo claramente.


Una mala práctica: poner configuración en el código

Un error común es guardar esos datos directamente en archivos como settings.py. Veamos por qué esto es un problema:

❌ Algunos valores son confidenciales. Si alguien tiene acceso al código, también puede ver contraseñas y claves (grave problema de seguridad).

❌ Si cambias una clave o URL, debes modificar el código y hacer un nuevo despliegue, aunque el resto del sistema siga igual.

Por eso, se recomienda usar un enfoque más profesional...


El enfoque de los 12 factores

En 2011 la empresa Heroku propuso una guía llamada 12factor. Hay un punto clave que nos interesa:

➡️ Separar la configuración del código.

La idea es que el código sea el mismo en todos los entornos (desarrollo, pruebas, producción), y que la configuración cambie según el contexto.

¿Y cómo se pasa esa configuración desde afuera? Usando las llamadas variables de entorno.


Qué son las variables de entorno

Son valores que se pueden definir en el entorno del sistema operativo o en un archivo especial, y que se pueden leer desde tu aplicación.

Imagina que ponemos esto en settings.py:

import os

SECRET_KEY = os.environ['SECRET_KEY']

Al ejecutar el proyecto, Django intentará leer el valor de la variable de entorno SECRET_KEY. Si no existe, lanzará una excepción.

Este método es más seguro que escribir la clave directamente en el código, pero tiene algunos problemas:

❌ Si la variable no existe se genera un error (KeyError).

❌ Los valores siempre vienen como texto, entonces hay que convertirlos (por ejemplo, de "True" a True).

❌ Hay que definir estas variables en cada servidor manualmente.

Para simplificar esto, usamos una biblioteca muy útil...


Usar archivos .env con python-dotenv

La biblioteca python-dotenv te permite guardar variables de entorno en un archivo de texto llamado .env, y automáticamente las carga al entorno de ejecución.

Un archivo .env típico podría verse así:

DEBUG=True
SECRET_KEY=clave-super-secreta
DATABASE_URL=psql://usuario:clave@127.0.0.1:5432/mi_base

Este archivo no se sube al repositorio (se agrega al .gitignore), porque puede contener claves sensibles o configuraciones específicas por máquina.

Para integrarlo en Django, en tu archivo settings.py haces lo siguiente:

from dotenv import load_dotenv
import os

load_dotenv()  # Cargar las variables del archivo .env

SECRET_KEY = os.getenv('SECRET_KEY')
DEBUG = os.getenv('DEBUG') == 'True'

Así, simplificas el manejo de todas las claves y datos sensibles de configuración.


Configurar una base de datos vía variables

Cuando tú creas un proyecto en Django, por defecto viene con una base SQLite:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

Eso está bien para desarrollo, pero en producción seguramente vas a usar PostgreSQL u otro motor.
El problema: no debes codificar directamente esta configuración en settings.py.

Podrías extraer la URL desde una variable de entorno:

# .env
DATABASE_URL=psql://usuario:password@localhost:5432/mi_base

Y en tu settings.py, usamos la biblioteca dj-database-url:

import dj_database_url

DATABASES = {
    'default': dj_database_url.config(conn_max_age=600)
}

Gracias a esto, dj-database-url toma automáticamente DATABASE_URL y configura DATABASES por ti.

Si no has definido DATABASE_URL, puedes tener una base por defecto:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

db_from_env = dj_database_url.config(conn_max_age=600)
if db_from_env:
    DATABASES['default'].update(db_from_env)

¿Y en producción?

Una vez tu proyecto esté en línea, manejar la configuración será más complejo, especialmente si usas varias máquinas.

Algunas herramientas que se usan para eso:

Herramienta ¿Para qué sirve?
Ansible Administración remota y despliegue de infraestructuras
Kubernetes Orquestación de contenedores y configuración por entorno
Vault Manejo seguro de secretos y credenciales

Estas herramientas permiten mantener claves fuera del código fuente y automatizar el despliegue para distintos ambientes (producción, pruebas, desarrollo, etc.).


Resumen

  • La configuración de una aplicación incluye claves, contraseñas, puertos y URLs que no deben guardarse en el código.
  • Usar variables de entorno ayuda a mantener separado el código de la configuración.
  • La metodología de los 12 factores promueve buenas prácticas para entornos reales y escalables.
  • La librería python-dotenv permite cargar fácilmente variables desde un archivo .env.
  • Para manejar bases de datos externas, puedes usar dj-database-url y simplificar la configuración.
  • En producción, considera usar herramientas como Ansible, Kubernetes o Vault para gestionar configuraciones avanzadas y seguras.

Trabajo independiente

Configuración de variables de entorno

En esta actividad vamos a mejorar la gestión de configuración usando variables de entorno. Sigue estos pasos:

  1. Instala la biblioteca python-dotenv.
  2. Pasa los parámetros principales de configuración a un archivo de variables de entorno llamado .env.
  3. Configura el archivo settings.py para que lea los parámetros desde las variables de entorno definidas en .env.

Materiales adicionales

  1. Django settings

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY