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.

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
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.