Últimamente he tenido que contestar esta pregunta muchas veces. Así que he decidido crear un pequeño aporte.
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 originalexport 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 originalexport SECRET_KEY='ev^df6858wzb705f9qi4i)&u#8t$3zetzh!+1&6$zh7=durvkx';
En nuestro
base.py
podemos crear la siguiente función:
Código Python:
Ver originalimport 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)
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.
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 originalimport 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.