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