Configuración avanzada de settings.py

Básico
Django
Django
Actualizado: 18/04/2026

El archivo settings.py

El archivo settings.py es el núcleo de configuración de un proyecto Django. Contiene todo lo necesario para que Django sepa cómo comportarse: qué aplicaciones están instaladas, cómo conectarse a la base de datos, dónde están los archivos estáticos y cómo gestionar la seguridad.

Diagrama conceptual de Configuración avanzada de settings.py

Configuraciones de seguridad fundamentales

# settings.py

# Clave secreta: NUNCA expongas este valor en repositorios públicos
SECRET_KEY = 'django-insecure-...'  # En producción, usar variables de entorno

# DEBUG: True en desarrollo, False en producción
DEBUG = True

# Hosts permitidos para servir la aplicación (crucial en producción)
ALLOWED_HOSTS = ['localhost', '127.0.0.1']

En producción, SECRET_KEY y otras credenciales se leen desde variables de entorno con os.environ.get('SECRET_KEY') o con la librería python-decouple.

Aplicaciones instaladas

INSTALLED_APPS lista todas las aplicaciones activas en el proyecto, tanto las de Django como las propias:

INSTALLED_APPS = [
    # Django contrib apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Librerías de terceros
    'rest_framework',
    # Aplicaciones propias
    'catalogo.apps.CatalogoConfig',
    'usuarios.apps.UsuariosConfig',
]

Configuración de base de datos

Django soporta múltiples motores. La configuración de DATABASES establece el motor, nombre, usuario y contraseña:

# SQLite (por defecto en desarrollo)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# PostgreSQL (recomendado en producción)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mi_base_datos',
        'USER': 'postgres',
        'PASSWORD': 'contraseña_segura',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

Archivos estáticos y multimedia

# Archivos estáticos (CSS, JS, imágenes del proyecto)
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']  # En desarrollo
STATIC_ROOT = BASE_DIR / 'staticfiles'    # Destino de collectstatic

# Archivos subidos por usuarios
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

Para servir archivos media en desarrollo, hay que añadir las URLs de media a urls.py:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... tus URLs ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Internacionalización y zona horaria

LANGUAGE_CODE = 'es-es'
TIME_ZONE = 'Europe/Madrid'
USE_I18N = True    # Activa el sistema de traducción
USE_TZ = True      # Almacena fechas en UTC en la base de datos

Con USE_TZ = True (recomendado), Django guarda todas las fechas en UTC y las convierte a la zona horaria del usuario al mostrarlas, evitando problemas con el horario de verano.

Middleware

El orden de MIDDLEWARE importa: se aplican de arriba a abajo en la petición y de abajo a arriba en la respuesta:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Separación de configuraciones por entorno

La práctica recomendada es crear un módulo settings/ con archivos separados:

mi_proyecto/
    settings/
        __init__.py
        base.py       # Configuración común
        desarrollo.py # Sobreescribe para desarrollo
        produccion.py # Sobreescribe para producción
# settings/desarrollo.py
from .base import *

DEBUG = True
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

Se selecciona el archivo de configuración con la variable de entorno DJANGO_SETTINGS_MODULE:

export DJANGO_SETTINGS_MODULE=mi_proyecto.settings.produccion
python manage.py runserver

Logging

Django incluye soporte de logging estándar de Python. Una configuración básica para registrar errores en producción:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': BASE_DIR / 'logs/django.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}

Dominar settings.py desde el principio sienta las bases para desarrollar aplicaciones Django seguras, mantenibles y fácilmente desplegables en cualquier entorno.

Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Django es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Django

Explora más contenido relacionado con Django y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Entender la estructura y propósito de cada sección de settings.py. Configurar la base de datos con los parámetros correctos para desarrollo y producción. Establecer STATIC_URL, STATICFILES_DIRS y MEDIA_URL para archivos estáticos y multimedia. Adaptar LANGUAGE_CODE, TIME_ZONE y USE_I18N para internacionalización. Separar la configuración en archivos de desarrollo y producción usando variables de entorno.