Variables de entorno para proyectos de Python

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.


#  .   . API_KEY = 'very_secret_password' 

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.


 #  . from config import API_KEY app = Flask(__name__) app.config['API_KEY'] = API_KEY 

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 directo

Cree 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.


terminal_direnv

Source: https://habr.com/ru/post/472674/


All Articles