Django

Multiple configuraciones en Django

Mientras estamos desarrollando cualquier proyecto y tenemos nuestra configuración todo va bien, pero en el momento que hay que desplegar dicho proyecto y necesitamos cambiar esa configuración en producción, se convierte en algo incomodo, cuando estas trabajando con un ambiente que tiene integración continua ahi es donde se convierte en un problema.

Lo recomendable es crear un archivo de configuración base de donde cada entorno estará en caso de ser necesario sobre-escribiendo cada configuración.

Por lo que tendríamos una estructura de archivo parecida a esta:

Proyecto
    -Proyecto
        -settings
            *base.py
            *produccion.py
            *desarrollo.py
    -Aplicación

En nuestro archivo base.py tendríamos la configuración que no es sensible al entorno en donde se ejecute la aplicación, cosas como las aplicaciones instaladas, middleware, los hosts de la aplicación, en fin, cualquier configuración que quieras que este presente en todos los entornos.

Así lucirían nuestros archivos de configuración:
base.py

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = ''

DEBUG = True

ALLOWED_HOSTS = []

INSTALLED_APPS = [
    ...
]

MIDDLEWARE_CLASSES = [
    ...
]

ROOT_URLCONF = 'django_tutorial.urls'

TEMPLATES = [
    ..
]

WSGI_APPLICATION = 'django_tutorial.wsgi.application'

AUTH_PASSWORD_VALIDATORS = [

]

STATIC_URL = '/static/'

Para cada entorno simplemente importar todo desde la configuración base y sobre-escribir las configuraciones necesarias

produccion.py

from proyecto.settings.base import *
DEBUG = False

desarrollo.py

from proyecto.settings.base import *

DEBUG = True

Una vez realizado esto para ejecutar nuestro proyecto en cualquier ambiente, tendremos que especificar la configuración a usar

python manage.py runserver 8080 --settings=proyecto.settings.produccion

Podemos asignar una configuración a tomar por defecto, solo tendremos que configurar nuestro archivo manage.py

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proyecto.settings.desarrollo")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Esto nos facilitara ejecutar nuestro proyecto sin el argumento –settings y tomar la configuración de desarrollo

python manage.py runserver 8080 

Para poder usar nuestra la configuración actual en la cual el proyecto esta corriendo, es necesario hacerlo de la siguiente manera:

En vez de incluir neustra configuracion directamente

from proyecto import settings

Tendremos que hacerlo de esta manera

from django.conf import settings

Django retornara la configuracion actual en la que nuestro proyecto esta corriendo.

Cambiar la configuracion por defecto en nuestro archivo wsgi.py

Referencia

Django Docs
Django Configuracion