Buena práctica de Django: mantener diferentes ficheros de configuración (y entornos)

Para el aseguramiento de la entrega de un producto de calidad, uno de los temas más importantes es la integración contínua. A través de la integración contínua podemos contar con procesos automatizados que permiten que, después de cada integrante del equipo de desarrollo suba su código al repositorio, podamos obtener la última versión y además ésta funcione y pase todo el conjunto de pruebas unitarias.

Para faciliar ésto, necesitamos preparar Django para que pueda tener diferentes ficheros de configuración. En general, los ficheros que se suelen incluir son:

  • base.py: es el fichero común para todas las instancias del proyecto.
  • local.py: las configuraciones específicas del desarrollador que trabaja en local. Aquí se suele incluir el modo DEBUG, la generación de logs y la activación de librerías necesarias para el desarrollador, como django-debug-toolbar.
  • staging.py: es una versión anterior a producción, pero que se ejecuta en dicho entorno. Útil para que las personas responsables del usuario puedan probar funcionalidades antes de activar la versiónde producción. Podemos considerarlo un entorno de integración.
  • test.py: fichero para el entorno de test.
  • production.py: el fichero de configuración del entorno de producción.

¿Y cómo se utiliza ésto?

Si queremos ejecutar el servidor local, tendríamos que invocar el fichero de configuración concreto que necesitamos:

python manage.py runserver --settings=miapp.settings.local

Un ejemplo de lo que podría haber en el fichero de configuración local.py es ésto:

from .base import *
DEBUG = True
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'miapp',
'HOST': 'localhost',
}
}
INSTALLED_APPS += ['debug_toolbar', ]

Observa como local.py incluye valores de configuración detalados en base.py

A partir de aquí, las posibilidades son infinitas. Por ejemplo, nos podemos plantear crear varios ficheros de configuración adicionales para los entornos locales de desarrollo de diferentes personas, por ejemplo: localpepito.py y localmanolo.py. Ambos ficheros podrían compartir cosas en común en otro tercer fichero local.py, y tan sólo tendríamos que integrarlas en cada uno de la siguiente forma:

# settings/local_pepito.py
from .local import *
# Set short cache timeout
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'miapp',
'HOST': '192.168.0.5',
}

Y como última sugerencia, es también buena práctica sacar todos estos ficheros de nuestro control de versiones.