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