Múltiples settings en Django

Por user Jean Carlos Mariños Urquiaga
Múltiples settings en Django

Aprende a organizar tus archivos de configuración en Django, el framework web de Python más utilizado.

En este tutorial vamos a aprender a organizar nuestro archivo de configuración en un proyecto en Django, con la finalidad de utilizarlos en distintos ambientes de desarrollo. Si aún no sabes qué es Django, a continuación te lo explico.

Django es el framework de desarrollo web escrito en Python, y uno de los más populares y utilizados.

Para este tutorial vamos a asumir que ya tienes conocimientos básicos de Django, realmente no se necesita tener mucha experiencia para entrar en este tema.

Archivo de Configuración

En general cuando creamos algún proyecto, el o los archivos de configuración siempre son los más importante. En el caso particular de Django, al momento de generar un proyecto consigo se crea un archivo llamado settings.py que es nuestro archivo de configuración, así que ahora hablaremos un poco de este.

Settings.py

Sin duda, uno de los archivos más importantes de todo el proyecto, toda la configuración que usará Django en nuestro proyecto estará dentro de este archivo, por lo que se debe tener mucho cuidado al momento de manipularlo. Por defecto Django te trae solo un archivo settings.py, veamos cual es el contenido de este archivo.


# settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = 'i8^^4z@7g9%%mt=%$^70qt83goyi8c5y*e3pyr@5ui2^ckm==t'
DEBUG = True

ALLOWED_HOSTS = []

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'ejemplo.urls'
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'ejemplo.wsgi.application'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

STATIC_URL = '/static/'

Este es el archivo settings.py que Django crea por defecto (por cierto es la versión 1.8 de Django, en versiones anteriores el archivo puede tener algunas variaciones), toda configuración siempre está asociado al nombre de una variable, así que al momento de hacer las modificaciones siempre tomen en cuenta eso, las variables no pueden ser modificadas porque Django simplemente ya no las tomará en cuenta. Pasemos a explicar las configuraciones más importantes que trae ese archivo.

BASE_DIR

Esta es la variable que tiene por contenido la ruta a una determinada zona de tu proyecto, por defecto lleva la ruta al archivo settings.py, si te queda la curiosidad de ver su contenido, pues adelante imprímela (print BASE_DIR).

SECRET_KEY

Todo proyecto en Django tiene esta variable que lleva una clave secreta, el contenido de esta variable siempre debe estar protegida y nunca escrita como texto plano dentro del archivo, por defecto Django la pone así pero ya es trabajo del desarrollador protegerla.

DEBUG

Variable boleana solo acepta True o False. True cuando tu proyecto está en modo de depuración, esto lo notas fácilmente cuando te sale algún error y ves la pantalla amarilla de Django donde te muestra el detalle del error obtenido. False cuando el proyecto ya no se encuentra en modo de depuración, esto se suele utilizar cuando el proyecto ya se encuentra en producción.

ALLOWED_HOSTS

Host permitidos para el proyecto, mientras el DEBUG este en True esta variable puede permanecer vacía, cuando DEBUG cambie a False debes agregar un host obligatorio que puede ser el dominio de tu sitio.

INSTALLED_APPS

Variable donde agregamos las aplicaciones de terceros que vayamos utilizando o las que vayamos creando.

TEMPLATES

También podemos configurar los templates gracias a esta variable, actualmente en la versión 1.8 podemos utilizar 2 motores de templates, los de django y jinja2.

DATABASES

Variable de configuración de Base de Datos, aquí podemos configurar cualquier motor de base de datos que Django utilice(MySQL, Postgres, Oracle, etc).

STATIC_URL

Variable que utilizamos al momento de enlazar nuestros archivos estáticos en los templates.

Bien estas son algunas de las variables que Django trae por defecto, el hecho de todo esto que necesitamos diferentes archivos de configuración para trabajar dependiendo del ambiente de desarrollo donde nos encontremos.

Ambientes de Desarrollo

Existe varios ambientes de desarrollo, pero hablaremos de los mas utilizados.

Ambiente Local

En este ambiente siempre iniciamos el desarrollo de un proyecto, es cuando te encuentras trabajando en tu computador.

Ambiente Producción

En este ambiente ya tenemos nuestro proyecto en un servidor de producción, de hecho que aquí las configuraciones son muy diferentes al ambiente local.

Estos son los dos ambientes principales, en cada uno de ellos necesitamos configuraciones diferentes, es por eso que vamos a separar nuestro archivo de configuración.

Múltiples archivos de configuración

Necesitamos tener un archivo de configuración para cada ambiente de desarrollo, como tenemos 2 ambientes, utilizaremos dos archivos diferentes, y un tercero para poner las configuraciones comunes entre ambos.

Primero deben crear una carpeta en el mismo lugar en donde esta su archivo settings.py, a esta carpeta llámenla settings, dentro de esta carpeta tendremos 4 archivos: __init__.py, base.py, local.py, production.py.

__init__.py

Este archivo sirve para hacer que la carpeta settings.py, sea visto como un modulo por Django y asi la pueda entender.

base.py

Archivo donde pondremos las configuraciones comunes entre todos los ambientes de desarrollo. Veamos el contenido de este.


# base.py
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = 'i8^^4z@7g9%%mt=%$^70qt83goyi8c5y*e3pyr@5ui2^ckm==t'

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

ROOT_URLCONF = 'ejemplo.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'ejemplo.wsgi.application'

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

Estas son las configuraciones que tendrá nuestro archivo base.py, recuerden que están son configuraciones comunes entre los demás ambientes.

local.py

Archivo donde pondremos toda nuestro configuración local, ósea cuando trabajamos en nuestro computador. Este archivo quedaria así.


# local.py
from .base import *
DEBUG = True
ALLOWED_HOSTS = []

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

STATIC_URL = '/static/'

El archivo local.py se hace mucho más pequeño, aquí pueden poner las configuraciones con las cuales quieren trabajar en su computador, y en la primera linea importamos todas las configuraciones de nuestro archivo base.py

production.py

El archivo production.py es una copia del archivo local.py , solo que ahora debes cambiar las configuraciones de acuerdo a lo que vas a utilizar en tu servidor de producción. Esto es simplemente un ejemplo.


# production.py
from .base import *
DEBUG = False
ALLOWED_HOSTS = ['devcode.la']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

STATIC_URL = 'https://devcode.la/static/'

La estructura final de tus archivos de configuración seria esta.


¡Listo!, ya tenemos bien separados nuestros archivos de configuración. Recuerden eliminar el archivo settings.py porque ya no se va a utilizar. Ahora para correr el servidor o realizar alguna operación que tengan en el archivo manage.py, como el runserver, makemigrations, migrate, collectstatic, etc, siempre deben decir el archivo de configuración van a utilizar, para eso por la terminal ponemos lo siguiente.


$ python manage.py runserver --settings=ejemplo.settings.local

Ahora, ya sabemos cómo separar y organizar de una manera correcta el archivo de configuración que trae Django por defecto. Si desean aprender más sobre la organización de un proyecto, los invito a nuestros cursos de Django, Curso de Django 1.7, Fundamentos de Django 1.8.

user

Jean Carlos Mariños Urquiaga

Backend Developer | Python / Django - Javascript / Node.js