Variáveis de ambiente e chaves secretas com python-decouple

19/11/2020 - 3 min de leitura

PYTHON

O processo de desenvolvimento de software é bastante vasto e cheio de boas práticas em todos os locais de bom conteúdo. Hoje eu venho trazer a dica de um pacote incrível criado pelo Henrique Bastos: o python-decouple.

Essa lib ajuda os desenvolvedores python a organizar o ambiente de trabalho e as variáveis de ambiente, de forma que não necessitamos ter mais de um arquivo para guardar os estágios do desenvolvimento.

Contexto

Principalmente no desenvolvimento com Django, é muito comum a gente ter espalhado variávies sensíveis no arquivo de settings.py. O exemplo principal e mais evidente é a chave de SECRET_KEY do Django, que, dentre outras coisas, serve como chave por onde o Django vai gerenciar as sessões e gerar as senhas criptografadas.

Já outro exemplo são as strings de conexão com o banco de dados e e-mail.

É muito perigoso deixar essas informações a vista no projeto, principalmete se for um projeto open-source, que o mundo tem acesso. Qualquer pessoa de índole ruim que tiver acesso a essas chaves sensíveis, pode fazer um estrago grande na vida do programador.

O problema

Acontece que, para gerenciar essas informações de chaves em diferentes máquinas, é comum de se encontrar a galera separando os arquivos.

Um exemplo prático: O programador têm 3 tipos de settings.py, um só com informações genéricas chamado settings.py, um só com as configurações locais do programador, development.py ou settings_local.py e o terceiro com as informações do servidor, como BD, etc chamado deploy.py.

Aí no arquivo principal, o programador só vai incluindo as configurações complemenares dos outros arquivos.

E isso é de uma perda de tempo gigantesca. Não necessitamos separar o settings em vários arquivos.

Solução 1: os.environ

Para separar essas chaves, podemos utilizar de variáveis de ambiente. O Python já vem com um módulo onde a gente pode adicionar e recuperar esses dados que mudam de ambiente para ambiente.

Para adicionar alguma variável:

import os

os.environ['SECRET_KEY'] = 'abc'

E para recuperar:

import os

SECRET_KEY = os.environ['SECRET_KEY']

As variáveis de ambiente tem uma limitação. Elas têm que ser do tipo string. Então, caso você queira salvar qualquer outro tipo de valor, tem que salvar em string primeiro e depois fazer um cast na recuperação desse dado.

Solução 2: python-decouple

O Decouple entra na jogada através de uma genialidade sem igual do HB. Primeiro, que ele elimina a necessidade de estar setando variáveis de ambiante através do código, coisa que não era possível pelo módulo padrão do Python. E segundo, que a gente já pode setar um cast por padrão para a recuperação dos dados.

Para instalar o Decouple:

pip install python-decouple

Veja o exemplo de como usar:

from decouple import config

SECRET_KEY = config('SECRET_KEY', default='valor padrão, caso não exista essa variável de ambiente')
DEBUG = config('DEBUG', cast=int, default=False)

E para setar essas váriaveis de ambiente, só precisamos ter um arquivo .env na pasta do projeto, geralmente na mesma pasta do settings ou na raiz (caso não seja um projeto Django).

Veja um exemplo de um arquivo .env:

SECRET_KEY=nao precisa de aspas na string
DEBUG=True

Tudo é string no .env. Não precisa definir as aspas, pois o decouple vai converter tudo aquilo para string, por padrão. A não ser que seja informado algum cast em específico, como fiz lá no exemplo da variável DEBUG.

Outra coisas interessante de se atentar é que a atribuição no Decouple é feita sem espaços entre o "=". Tem que ser tudo junto, pois ele vai fazer o split da string pelo "=" e, se tiver espaços, vai dar problema.

Foto da capa by Kristina Flour on Unsplash

 

Compartilhe

Twitter