El sistema de configuración de Django centraliza todos los parámetros necesarios para el funcionamiento de una aplicación. Comprender su arquitectura y mecanismos de carga es fundamental para desplegar proyectos robustos y seguros.
Fundamentos del Módulo de Ajustes
En esencia, el archivo de configuración no es más que un módulo estándar de Python. Las directivas que contiene se definen como variables a nivel de módulo y, por convención estricta del framework, deben declararse en mayúsculas.
ALLOWED_HOSTS = ['api.production.com', '192.168.1.50']
SECRET_KEY = 'super-secret-key-for-production-env'
STATIC_ROOT = '/var/www/myproject/static_assets'
Dado que se trata de código Python ejecutable, el archivo hereda todas las características del lenguaje:
- El intérprete validará la sintaxis; cualquier error impedirá el arranque del servidor.
- Es posible emplear lógica condicional, importaciones y funciones para generar valores dinámicos.
- Se pueden importar constantes desde otros módulos para mantener el código organizado.
Mecanismos para Seleccionar el Archivo Activo
El framework necesita saber explícitamente qué módulo utilizar al inicializarse. Esto se logra mediante la variable de entorno DJANGO_SETTINGS_MODULE, la cual debe apuntar a la ruta de importación de Python (por ejemplo, core.settings.production).
Uso con la Interfaz de Línea de Comandos
Al interactuar con herramientas como manage.py o django-admin, la variable se puede inyectar en la sesión de la terminal o pasar como argumento directo:
# Inyección en sistemas basados en Unix (bash/zsh)
export DJANGO_SETTINGS_MODULE=core.settings.staging
python manage.py migrate
# Inyección en entornos Windows (CMD)
set DJANGO_SETTINGS_MODULE=core.settings.staging
python manage.py migrate
Alternativamente, se puede forzar la configuración en cada ejecución mediante el flag --settings:
python manage.py runserver --settings=core.settings.local
Integración con Servidores WSGI/ASGI
En entornos de producción con servidores como Gunicorn o uWSGI, la variable de entorno suele definirse en el archivo de configuración del servidor o directamente en el script de punto de entrada WSGI/ASGI:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings.production')
application = get_wsgi_application()
Jerarquía y Valores por Defecto
No es obligatorio definir cada parámetro existente. Django mantiene un archivo interno (django/conf/global_settings.py) que provee valores por defecto para todas las variables posibles.
El proceso de carga sigue una jerarquía de dos pasos: primero se leen los valores predeterminados y luego se superponen los definidos en tu módulo personalizado, sobrescribiendo solo las claves especificadas. Para auditar qué variibles has modificado respecto a los valores base, puedes ejecutar:
python manage.py diffsettings
Consumo de Ajustes en el Código de la Aplicación
Para acceder a las variables desde cualquier parte de tu código (vistas, modelos, servicios), debes importar el objeto settings proporcionado por el framework. Nunca importes tu módulo de configuración directamente.
from django.conf import settings
def process_payment(amount):
if settings.PAYMENT_GATEWAY_SANDBOX:
# Lógica para entorno de pruebas
return mock_gateway_charge(amount)
# Lógica para entorno real
return live_gateway_charge(amount)
Advertencia crítica: El objeto settings se evalúa de forma perezosa (lazy). Intentar modificar sus atributos durante la ejecución de la aplicación resultará en comportamientos impredecibles y debe evitarse por completo.
Seguridad y Definición de Parámetros Personalizados
El archivo de configuración almacena credenciales críticas (claves API, contraseñas de bases de datos). En infraestructuras compartidas o servidores públicos, es imperativo restringir los permisos de lectura del archivo (chmod 600 settings.py).
Si necesitas agregar variables específicas para tu lógica de negocio, simplemente añádelas al módulo respetando dos reglas:
- El nombre de la variable debe estar completamente en mayúsculas.
- El identificador no debe colisionar con las variables nativas de Django.
Configuración Programática (Sin Variable de Entorno)
En escenarios donde Django se utiliza como componente dentro de una aplicación más grande (o en scripts aislados y pruebas unitarias), puedes inicializar los ajustes manualmente usando el método configure().
from django.conf import settings
settings.configure(
DATABASES={'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:'}},
INSTALLED_APPS=['my_custom_app'],
USE_TZ=True
)
Este método acepta un número arbitrario de argumentos de palabra clave. Si deseas que tu configuración personalizada herede de un módulo específico en lugar de los valores globales de Django, puedes pasar dicho módulo como primer argumento posicional (default_settings):
from django.conf import settings
from my_project import base_defaults
# Ambas sintaxis son funcionalmente idénticas
settings.configure(default_settings=base_defaults, CUSTOM_FLAG=True)
settings.configure(base_defaults, CUSTOM_FLAG=True)
Mutua Exclusividad en la Inicialización
El framework impone una restricción estricta respecto a la inicialización de los ajustes: debes utilizar o bien la variable de entorno DJANGO_SETTINGS_MODULE o bien el método settings.configure().
- Si no se establece ninguno de los dos al intentar acceder a una configuración, Django lanzará una excepción de configuración inadecuada.
- Si se intentan configurar ambos mecanismos simultáneamente, o si se llama a
configure()más de una vez, el sistema arrojará unRuntimeError.