En un proyecto no basta con tener un solo archivo settings.py ya que podemos necesitar de librerias durante el desarrollo que no son necesarias en producción o porque necesitamos cierta configuración cuando ejecutamos los tests.

Sea cual sea el caso, mantener separados y ordenados nuestros entornos es lo recomendable.

Es recomendable definir al menos 3 entornos:

  1. Desarrollo
  2. Pruebas
  3. Producción

Desarrollo

Durante el desarrollo generalmente usamos librerias que no deben ir a producción, por ejemplo para debuging (django-debug-toolbar), también usamos diferentes configuraciones en cuanto al envio de correos, credenciales de aplicaciones de terceros (facebook, twitter, amazon, etc).

Producción

En el ambiente de producción se hacen uso de otras librerias extra que nos permiten hacer un seguimiento de nuestra aplicación (sentry, newrelic, etc), tambien cambian las credenciales de aplicaciones de terceros o pueden requerirse configuraciones extra que solo tienen sentido para la aplicación en producción

Testing

Cuando hacemos testing necesitamos de librerias para hacer mocking y automatizar los tests, ademas de que podemos correr los tests con una configuración distinta de base de datos para que se puedan ejecutar mas rapidamente (evitar que se corran las migraciones de south).

En conclusión es buena idea sustituir el archivo settings.py por un paquete settings cuyo contenido seria el siguiente:

  • __init__.py
  • base.py
  • dev.py
  • production.py
  • test.py

La configuración básica la colocamos en base.py luego en los demas archivos importamos la configuración de base.py y agregamos las configuraciones necesarias para cada entorno.

Supongamos que queremos agregar django-debug-toolbar al entorno de desarrollo, la configuración sería de la siguiente manera:

from .base import *

INSTALLED_APPS += ('debug_toolbar',)

# ...

Analogamente para los demas entornos.

Para ejecutar el archivo settings correspondiente al entorno en donde estemos, lo hacemos mediante el siguiente comando:

python manage.py --settings=path_to_settings_file