Django por defecto te crea un
settings.py
en una carpeta llamada igual que tu proyecto. Pero hay varias implicaciones que un novato no toma en cuenta al desarrollar. ¿Que tal si quiero tener un settings para desarrollo y otro para producción o tal vez para mas ambiente? ¿Necesito hardcodear mis credenciales en los settings? Todas esas preguntas y mas serán respondidas conforme avancemos en este tutorial.1. ¿Como dividir mis settings?
Esto suena complicado, pero realmente es la parte mas sencilla.
Recuerdas el archivo settings.py? bueno donde se encuentre ubicado crea una carpeta llamada
settings
y crea los siguientes archivos __init__.py
base.py
development.py
production.py
__init__.py
-> Convertira la carpeta settings a un paquete. Este archivo puede estar vació, no hay ningún problema.base.py
-> en este archivo pondremos todos los settings que tengan en común todos los ambientes.development.py
-> aquí pondremos nuestros settings de desarrollo.production.py
-> y aquí pondremos nuestros settings de producción.Ejemplos
Código Python:
Ver original
# base.py # ... INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myapp', ) # ...
Código Python:
Ver original
# development.py # Settings de desarrollo from .base import * INSTALLED_APPS += ( 'debug_toolbar', )
Código Python:
Ver original
# production.py # Settings de produccion from .base import * # ...
Excelente ya hemos creado todos nuestros archivos pero como le diremos a django que use
development.py
o production.py
?Vamos a ver por un momento nuestro
manage.py
Código Python:
Ver original
#!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv)
Oh, mira! Busca la variable de entorno llamada
DJANGO_SETTINGS_MODULE
y si no la encuentra asume que esta en myproject.settings
Si nosotros ponemos la variable de entorno
DJANGO_SETTINGS_MODULE
entonces podemos indicar que archivo utilizar.2. ¿Donde pongo mis variables de entorno?
Mi respuesta: Donde quiera que lo consideres adecuado.
Mis gustos: Yo lo pongo al final de mi script activate del entorno virtual.
Ejemplo en windows
Código BASH:
Ver original
:: activate.bat set "DJANGO_SETTINGS_MODULE=myproject.settings.development"
Ejemplo en linux y Mac OS X
Código BASH:
Ver original
export DJANGO_SETTINGS_MODULE='myproject.settings.development';
3. ¿Tengo que hardcodear mis credenciales (username, passwords, api keys, tokens, etc...) en los settings?
La respuesta es: "NO, Y NO DEBES".
¿Recuerdas como pusimos la variable de entorno
DJANGO_SETTINGS_MODULE
? Así mismo podemos crear otras variables de entorno y guardar nuestra credenciales ahí mismo.Ejemplo: Supón que ponemos el SECRET_KEY en una variable de entorno.
Código BASH:
Ver original
:: activate.bat set "SECRET_KEY=ev^df6858wzb705f9qi4i)&u#8t$3zetzh!+1&6$zh7=durvkx"
Ejemplo en linux y Mac OS X
Código BASH:
Ver original
export SECRET_KEY='ev^df6858wzb705f9qi4i)&u#8t$3zetzh!+1&6$zh7=durvkx';
En nuestro
base.py
podemos crear la siguiente función:
Código Python:
Que lo único que hace es obtener el valor de una variable de entorno o lanzar una excepción en caso que no la encuentre.Ver original
import os from django.core.exceptions import ImproperlyConfigured def get_env_variable(var_name): """ Get the environment variable or return exception """ try: return os.environ[var_name] except KeyError: error_msg = "Set the %s environment variable" % var_name raise ImproperlyConfigured(error_msg)
Podemos utilizar esa función una vez definida, ya sea en
base.py
, development.py
o production.py
En este caso lo utilizare en
base.py
porque no importa en que ambiente me encuentre necesitare una SECRET_KEY
.Para el caso de la base de datos, tal vez se te haga muy pesado tienes que hacer diferentes variables de entorno. Para ese caso te recomiendo instalar dj-database-url lo puedes hacer con
pip install dj-database-url
.Para usarla basta con tener esto es tu base.py
Código Python:
Ver original
import dj_database_url DATABASES = {'default': dj_database_url.config()}
Y tus variables de entorno tener la variable llamada
DATABASE_URL
y el valor de la variable de entorno depende de que base de datos uses. Aquí hay una tabla completa.PD:
myproject
es solo un placeholder para el nombre del proyecto. No olvide reemplazarlo por el nombre de tu proyecto.