Variables de entorno para proyectos de Python
Al desarrollar una aplicación web o bot, a menudo tratamos con cualquier información secreta, varios tokens y contraseñas (claves API, secretos de formularios web). Codificar esta información, y mucho menos almacenarla en un sistema de control de versiones disponible públicamente, es una muy mala idea.
Archivos de configuración
La forma más fácil de resolver este problema es crear un archivo de configuración separado con toda la información confidencial y agregarlo a .gitignore
. La desventaja de este enfoque es que en git también necesita mantener la plantilla del archivo de configuración y no olvide actualizarla periódicamente.
Variables de entorno
Un enfoque más avanzado es utilizar variables de entorno. Las variables de entorno son variables con nombre que contienen información textual que los programas pueden usar. Por ejemplo, para iniciar una aplicación de matraz, primero debe especificar el nombre de nuestra aplicación en la variable de entorno FLASK_APP
:
$ export FLASK_APP=hello.py $ flask run * Running on http://127.0.0.1:5000/
Usando variables de entorno, puede obtener varios parámetros de aplicación y claves secretas:
import os app.config['API_KEY'] = os.environ.get('API_KEY')
Biblioteca Python-dotenv
Para no establecer manualmente las variables de entorno cada vez que se reinicia el terminal, puede usar el paquete python-dotenv . Le permite cargar variables de entorno desde el archivo .env
en el directorio raíz de la aplicación.
Instala el paquete:
pip install python-dotenv
Ahora puede crear un archivo .env con todas las variables de entorno que necesita su aplicación. Importante, agregue el archivo .env
a .gitignore
, no lo almacene en el sistema de control de versiones.
import os from dotenv import load_dotenv dotenv_path = os.path.join(os.path.dirname(__file__), '.env') if os.path.exists(dotenv_path): load_dotenv(dotenv_path)
Este archivo .env se puede usar para todas las variables de configuración, pero no se puede usar para las variables de entorno FLASK_APP
y FLASK_DEBUG
, ya que ya son necesarias durante la carga inicial de la aplicación.
Utilidad Direnv
Las variables de entorno se pueden cargar automáticamente al ingresar a la carpeta del proyecto, esto es especialmente conveniente cuando se trabaja con varios proyectos al mismo tiempo. La utilidad direnv te permite hacer esto. Direnv es un administrador de variables de entorno de terminal que admite bash, zsh, tcsh y otros shells. Le permite cargar y descargar automáticamente variables de entorno según su directorio actual. Esto le permite tener variables de entorno específicas para cada proyecto. Antes de cada invitación, se verifica la presencia del archivo .envrc
en los directorios actual y principal. Si el archivo existe, se carga en el subpatrón bash, y todas las variables exportadas son capturadas por direnv y luego disponibles para el shell.
Instalar direnv
sudo apt-get install direnv
A continuación, debe realizar cambios para configurar nuestro shell; para bash, agregue lo siguiente al final del ~/.bashrc
y reinicie la consola:
eval "$(direnv hook bash)"
Ejemplo directoCree una nueva carpeta para el proyecto:
$ mkdir ~/my-project $ cd ~/my-project
Mostramos que la variable de entorno FLASK_APP no está cargada:
$ echo $FLASK_APP nope
Escriba las variables de entorno en el archivo .envrc
:
$ echo export FLASK_APP=hello.py > .envrc .envrc is not allowed
Para garantizar la seguridad, después de crear o modificar el archivo .envrc
, debe confirmar con el comando direnv allow:
$ direnv allow . direnv: reloading direnv: loading .envrc direnv export: +FLASK_APP
Mostramos que la variable de entorno está cargada:
$ echo $FLASK_APP hello.py
Cuando sale de la carpeta del proyecto, las variables de entorno se descargan
$ cd .. direnv: unloading
y te vuelves inquieto
$ echo $FLASK_APP nope
Trabajando con entornos virtuales en direnv
Además de cargar variables de entorno, direnv también le permite trabajar con un entorno virtual para Python.
El entorno virtual le permite utilizar diferentes versiones del intérprete de Python y los paquetes de la biblioteca para proyectos individuales. Hay varias formas de crear un entorno virtual para Python, aquí miramos el módulo venv, para otras opciones se describen en la documentación directa .
Para usar venv para crear y activar automáticamente un entorno virtual, debe agregar el siguiente código al ~/.config/direnv/direnvrc
(consulte la documentación) .
Creando un entorno virtual
Si agrega una línea al archivo .envrc
layout python-venv
luego, cuando vaya a la carpeta direnv, creará un entorno virtual en la carpeta direnv, por ejemplo .direnv/python-venv-3.7.3
.
Para crear un entorno virtual con una ruta diferente, por ejemplo, en la carpeta venv más familiar, debe configurar la variable VIRTUAL_ENV
:
export VIRTUAL_ENV=.venv
Del mismo modo, puede conectar un entorno virtual ya creado.
Trabaja con diferentes versiones de Python
Para instalar otra versión que no sea la de Python, debe usar el comando:
layout python-venv python3.6
Crear una cadena de solicitud de bash (PS1)
A diferencia de la activación manual del entorno virtual, en nuestro caso el bash prompt (PS1) no se cambiará (por lo general, parece (venv) user@comp:~$
). Para devolver la pantalla de activación del entorno virtual a la consola, agregue el siguiente código al ~/.bashrc
:
show_virtual_env() { if [[ -n "$VIRTUAL_ENV" && -n "$DIRENV_DIR" ]]; then echo "($(basename $VIRTUAL_ENV))" fi } export -f show_virtual_env PS1='$(show_virtual_env)'$PS1
Archivo de configuración de archivo .envrc
muestra
Así es como se .envrc
archivo .envrc
configurado para desarrollar una aplicación de matraz:
export VIRTUAL_ENV=venv layout python-venv export FLASK_APP=app.py export FLASK_DEBUG=1
Esto le permite activar automáticamente el entorno virtual y cargar variables de entorno al ingresar a la carpeta del proyecto.
