Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/09/2014, 22:36
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
[Aporte] ¿Cómo configurar Django como un pro?

Ú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
  1. # base.py
  2.  
  3. # ...
  4. INSTALLED_APPS = (
  5.     'django.contrib.admin',
  6.     'django.contrib.auth',
  7.     'django.contrib.contenttypes',
  8.     'django.contrib.sessions',
  9.     'django.contrib.messages',
  10.     'django.contrib.staticfiles',
  11.     'myapp',
  12. )
  13. # ...

Código Python:
Ver original
  1. # development.py
  2. # Settings de desarrollo
  3.  
  4. from .base import *
  5.  
  6. INSTALLED_APPS += (
  7.     'debug_toolbar',
  8. )

Código Python:
Ver original
  1. # production.py
  2. # Settings de produccion
  3.  
  4. from .base import *
  5.  
  6. # ...

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
  1. #!/usr/bin/env python
  2. import os
  3. import sys
  4.  
  5. if __name__ == "__main__":
  6.     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
  7.  
  8.     from django.core.management import execute_from_command_line
  9.  
  10.     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
  1. :: activate.bat
  2. set "DJANGO_SETTINGS_MODULE=myproject.settings.development"

Ejemplo en linux y Mac OS X
Código BASH:
Ver original
  1. 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
  1. :: activate.bat
  2. set "SECRET_KEY=ev^df6858wzb705f9qi4i)&u#8t$3zetzh!+1&6$zh7=durvkx"

Ejemplo en linux y Mac OS X
Código BASH:
Ver original
  1. 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:
Ver original
  1. import os
  2. from django.core.exceptions import ImproperlyConfigured
  3.  
  4. def get_env_variable(var_name):
  5.     """ Get the environment variable or return exception """
  6.     try:
  7.         return os.environ[var_name]
  8.     except KeyError:
  9.         error_msg = "Set the %s environment variable" % var_name
  10.         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 original
  1. import dj_database_url
  2. 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.