Variáveis ​​de ambiente para projetos Python

Variáveis ​​de ambiente para projetos Python


Ao desenvolver um aplicativo ou bot da Web, geralmente lidamos com algumas informações secretas, vários tokens e senhas (chaves de API, segredos de formulários da web). Codificar essas informações, muito menos armazená-las em um sistema de controle de versão disponível ao público, é uma péssima idéia.


#  .   . API_KEY = 'very_secret_password' 

Arquivos de configuração


A maneira mais fácil de resolver esse problema é criar um arquivo de configuração separado com todas as informações confidenciais e adicioná-lo ao .gitignore . A desvantagem dessa abordagem é que, no git, você também precisa manter o modelo do arquivo de configuração e não se esqueça de atualizá-lo periodicamente.


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

Variáveis ​​de ambiente


Uma abordagem mais avançada é usar variáveis ​​de ambiente. As variáveis ​​de ambiente são denominadas variáveis ​​que contêm informações textuais que os programas em execução podem usar. Por exemplo, para iniciar um aplicativo de balão, primeiro você precisa especificar o nome do nosso aplicativo na variável de ambiente FLASK_APP :


 $ export FLASK_APP=hello.py $ flask run * Running on http://127.0.0.1:5000/ 

Usando variáveis ​​de ambiente, você pode obter vários parâmetros de aplicativo e chaves secretas:


 import os app.config['API_KEY'] = os.environ.get('API_KEY') 

Biblioteca Python-dotenv


Para não definir manualmente as variáveis ​​de ambiente sempre que o terminal for reiniciado, você pode usar o pacote python-dotenv . Ele permite carregar variáveis ​​de ambiente do arquivo .env no diretório raiz do aplicativo.
Instale o pacote:


 pip install python-dotenv 

Agora você pode criar um arquivo .env com todas as variáveis ​​de ambiente que seu aplicativo precisa. Importante, adicione o arquivo .env ao .gitignore , não o armazene no sistema de controle de versão.


 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) 

Esse arquivo .env pode ser usado para todas as variáveis ​​de configuração, mas não pode ser usado para as variáveis ​​de ambiente FLASK_DEBUG e FLASK_DEBUG , pois elas já são necessárias durante o carregamento inicial do aplicativo.


Utilitário Direnv


As variáveis ​​de ambiente podem ser carregadas automaticamente ao entrar na pasta do projeto, o que é especialmente conveniente ao trabalhar com vários projetos ao mesmo tempo. O utilitário direnv permite fazer isso. Direnv é um gerenciador de variáveis ​​de ambiente de terminal que suporta bash, zsh, tcsh e outros shells. Permite carregar e descarregar automaticamente variáveis ​​de ambiente, dependendo do diretório atual. Isso permite que você tenha variáveis ​​de ambiente específicas para cada projeto. Antes de cada convite, a presença do arquivo .envrc nos diretórios atual e pai é verificada. Se o arquivo existir, ele será carregado no subpadrão bash e todas as variáveis ​​exportadas serão capturadas pelo direnv e disponibilizadas para o shell.


Instalar direnv


 sudo apt-get install direnv 

Em seguida, é necessário fazer alterações para configurar nosso shell; para o bash, adicione o seguinte ao final do ~/.bashrc e reinicie o console:


 eval "$(direnv hook bash)" 

Exemplo Direnv

Crie uma nova pasta para o projeto:


 $ mkdir ~/my-project $ cd ~/my-project 

Mostramos que a variável de ambiente FLASK_APP não está carregada:


 $ echo $FLASK_APP nope 

Escreva as variáveis ​​de ambiente no arquivo .envrc :


 $ echo export FLASK_APP=hello.py > .envrc .envrc is not allowed 

Para garantir a segurança, após criar ou modificar o arquivo .envrc , você precisa confirmar com o comando direnv allow:


 $ direnv allow . direnv: reloading direnv: loading .envrc direnv export: +FLASK_APP 

Mostramos que a variável de ambiente está carregada:


 $ echo $FLASK_APP hello.py 

Quando você sai da pasta do projeto, as variáveis ​​de ambiente são descarregadas


 $ cd .. direnv: unloading 

e tornar-se inquieto novamente


 $ echo $FLASK_APP nope 

Trabalhando com ambientes virtuais no direnv


Além de carregar variáveis ​​de ambiente, o direnv também permite trabalhar com um ambiente virtual para Python.
O ambiente virtual permite usar diferentes versões do interpretador python e dos pacotes da biblioteca para projetos individuais. Existem várias maneiras de criar um ambiente virtual para python, aqui olhamos para o módulo venv, pois outras opções são descritas na documentação do direnv .


Para usar o venv para criar e ativar automaticamente um ambiente virtual, você precisa adicionar o seguinte código ao ~/.config/direnv/direnvrc (consulte a documentação) .


Criando um ambiente virtual

Se você adicionar uma linha ao arquivo .envrc


 layout python-venv 

então, ao ir para a pasta direnv, criará um ambiente virtual na pasta direnv, por exemplo .direnv/python-venv-3.7.3 .
Para criar um ambiente virtual com um caminho diferente, por exemplo, na pasta venv mais familiar, você precisa definir a variável VIRTUAL_ENV :


 export VIRTUAL_ENV=.venv 

Da mesma maneira, você pode conectar um ambiente virtual já criado.


Trabalhar com diferentes versões do Python

Para instalar outra versão que não a versão do sistema do python, você precisa usar o comando:


 layout python-venv python3.6 

Crie uma sequência de prompt do bash (PS1)

Diferentemente da ativação manual do ambiente virtual, no nosso caso, o prompt do bash (PS1) não será alterado (geralmente se parece com (venv) user@comp:~$ ). Para retornar a exibição de ativação do ambiente virtual ao console, adicione o seguinte código ao ~/.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 

Exemplo de arquivo de configuração do arquivo .envrc

É assim que o arquivo .envrc configurado para desenvolver um aplicativo de balão pode ser:


 export VIRTUAL_ENV=venv layout python-venv export FLASK_APP=app.py export FLASK_DEBUG=1 

Isso permite ativar automaticamente o ambiente virtual e carregar variáveis ​​de ambiente ao entrar na pasta do projeto.


terminal_direnv

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


All Articles