Un problema muy común en cualquier aplicación django es la necesidad de
almacenar algún dato confidencial para su funcionamiento, por ejemplo
una clave, nombre de usuario, o identificador de un API, esto se suele hacer en el archivo de configuración settings.py, pero es una mala practica de
seguridad.
La solución es definir variables de entorno en el shell, e importarlas desde
settings.py, de manera que sea mas difícil que un fallo exponga la
información.
#!/bin/bash
#.bashrc
export EMAIL_HOST_USER="tuemail@gmail.com"
export EMAIL_HOST_PASSWORD="tuclave"
#settings.py
import os
EMAIL_HOST_USER=os.environ['EMAIL_HOST_USER']
EMAIL_HOST_PASSWORD=os.environ['EMAIL_HOST_PASSWORD']
La limitación de este sistema cuando se está usando virtualenv, es que no
permite tener distintos valores de una variable para cada entorno. Esto se
puede solucionar usando los hooks .virtualenvs/app_env/bin/postactivate
para establecer las variables al entrar en el entorno:
#!/bin/bash
# This hook is run after this virtualenv is activated.
export EMAIL_HOST_USER="tuemail@gmail.com"
export EMAIL_HOST_PASSWORD="tuclave"
y .virtualenvs/app_env/bin/predeactivate para limpiarlas al salir:
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
unset EMAIL_HOST_USER
unset EMAIL_HOST_PASSWORD
Click to read and post comments
Virtualenv es una herramienta para crear entornos virtuales para python.
Cuando mas de una aplicación python esta instalada en un mismo sistema, se
puede dar el caso de que requieran versiones incompatibles de una biblioteca,
que no sea posible instalarla en el directorio site-packages, o que no quieras
actualizar las bibliotecas de la aplicación cuando se actualizen las del
sistema.
Virtualenv soluciona todos estos problemas, permitiendo crear
entornos virtuales en los que se pueden instalar bibliotecas y programas,
de forma independiente del sistema, y otros entornos. Esto es especialmente
útil durante el desarrollo y despliegue de aplicaciones.
Virtualenv
Instalación
Para instalar virtualenv, lo mejor es usar el gestor de paquetes de tu
distribución, para hacer la herramienta disponible a todos los usuarios:
secnot@secnot:~$ sudo apt-get install python-virtualenv
Crear un entorno
Una vez instalado, vamos a crear un directorio donde almacenar todos nuetros
entornos, por ejemplo:
secnot@secnot:~$ mkdir virtualenvs
Ahora creamos un nuevo entorno dentro del directorio, como no queremos que use
ninguna libreria del sistema añadimos el parametro --no-site-packages
secnot@secnot:~$ virtualenv --no-site-packages virtualenvs/proyecto1_env
Instalar django en el entorno
Antes de instalar un nuevo paquete, tenemos que activar el entorno, para que
cambie los directorios de busquesda a los del entorno:
secnot@secnot:~$ source virtualenvs/proyecto1_env/bin/activate
Ahora ya podemos instalar django y los paquetes que necesitemos para nuestra
aplicación:
(proyecto1_env)secnot@secnot:~$ pip install django
(proyecto1_env)secnot@secnot:~$ pip install django-countries
(proyecto1_env)secnot@secnot:~$ django-admin.py startproject proyecto1
Para instalar un paquete no es necesario ser root, todos los paquetes se
almacenan en los directorios creados dentro de nuestro directorio.
Si te fijas verás que el prompt ha cambiado, indicando el entorno que está
activo.
Una vez no necesitemos el entorno podemos salir ejecutando:
(proyecto1_env)secnot@secnot:~$ deactivate
Requirements
Una funcionalidad muy útil es la generación de una lista con todos los paquetes
instalados en un entorno, esta normalmente se almacenan en un archivo llamado
requirements.txt. Este archivo puede usarse después para duplicar los
paquetes instalados al crear un nuevo entorno. Para generarla:
secnot@secnot:~$ source environments/env1/bin/activate
(env1)secnot@secnot:~$ pip freeze
Django==1.6
gunicorn==18.0
wsgiref==0.1.2
(env1)secnot@secnot:~$ pip freeze > requirements.txt
Si queremos instalar todos los paquetes de la lista en un entorno:
(env3)secnot@secnot:~$ pip install -r requirements.txt
Virtualenvwrapper
Virtualenvwrapper es un conjunto de scripts que automatizan la creación,
borrado, y gestión de entornos. Se puede trabajar directamente con virtualenv
sin ningún problema, pero virtualenvwrapper hace que todo el proceso sea un
poco más sencillo y cómodo.
Instalación y configuración
Instalamos virtualenvwrapper con el gestor de paquetes:
secnot@secnot:~$ sudo apt-get install virtualenvwrapper
Por defecto los entornos se almacenan en el directorio .virtualenvs y no
necesita mas configuración simplemente sal y vuelve ha hacer login en la cuenta
para que se configuren las variables de entorno.
Si por qualquier razón en tu sistema no ha funcionado, puedes configurarlo manualmente
y añadirlo en el script de inicio .bashrc:
secnot@secnot:~$ mkdir .virtualenvs
# /home/secnot/.bashrc
# Configuración de VIRTUALENVWRAPPER
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
# Ubuntu 14.04: source /etc/bash_completion.d/virtualenvwrapper
Uso
Estos son los comandos de virtualenvwrapper más usados, para mas detalles es
recomendable leer la documentación:
- mkvirtualenv: Crea un nuevo entorno, con la particularidad de que se convierte en el entorno activo.
- cpvirtualenv: Duplica un entorno.
- rmvirtualenv: Elimina un entorno, el entorno a elminar debes estar inactivo antes de eliminarlo.
- allvirtualenv: Ejecuta un comando en todos los entornos.
- workon: Selecciona el entorno activo, si no hay argumentos lista los entornos disponibles.
- deactivate: Desactiva el entorno indicado.
El mejor método para entender como funciona es un ejemplo, así el vamos a crear
dos entornos, despues instalar django en el primero de ellos, y por último
eliminar el segundo entorno:
secnot@secnot:~$ mkvirtualenv --no-site-packages env1
New python executable in env1/bin/python
Installing setuotools, pip...done.
(env1)secnot@secnot:~$ mkvirtualenv --no-site-packages env2
New python executable in env2/bin/python
Installing setuotools, pip...done.
(env2)secnot@secnot:~$ workon env1
(env1)secnot@secnot:~$ pip install django
(env1)secnot@secnot:~$ workon
env1
env2
(env1)secnot@secnot:~$ deactivate
secnot@secnot:~$ rmvirtualenv env2
Removing env2...
secnot@secnot:~$ ...
Si quieres usar una versión de Python distinta a la por defecto del sistema, puedes especificarla
en el momento de creación del entorno.
secnot@secnot:~$ mkvirtualenv -p /usr/bin/python3 --no-site-packages env1
Click to read and post comments