Stack Overflow em Português Asked by Vinicius Bussola on January 15, 2021
No meu projeto Django tenho algumas variáveis sensíveis, as quais preciso ‘escondê-las’.
No geral, as salvo em um arquivo .env e as leio com
DADO_SENSIVEL = os.environ.get("DADO_SENSIVEL", default="")
..
Gostaria de entender qual a diferença entre eu salvar essas variáveis no .env, no .bashrc e no .bash_profile
A resposta depende do uso do Docker? Se sim, qual seria a diferença usando e não usando o docker?
Não entendi completamente a pergunta, por exemplo: não consigo ver o relacionamento do django com o docker nesse contexto, mas vou tentar responder. Se entendi, o que vc quer é ocultar informações sensíveis em um projeto django. Considerando que seja isso vou explicar a minha abordagem (Eu uso linux):
Primeiro eu crio um arquivo do tipo .yaml
que pode ser "parseado" pelo pacote PyYAML, nesse arquivo coloco as informaçẽos sensiveis para serem lidas no setttings.py
do django, abaixo um exemplo:
db:
default:
ENGINE: 'django.db.backends.postgresql_psycopg2'
NAME: 'nome-banco'
USER: 'user-name'
PASSWORD: 'change-me'
HOST: 'localhost'
PORT: '5432'
OPTIONS: {}
email:
email_host: 'smtp.<config>.com'
email_port: 587
email_host_user: 'no_reply@<email.com>'
email_host_password: '<your_password>'
use_tls: True
key: sdn2-%Hey-Jude_take-a-sad-song_and_make-it-better
Veja que nesse arquivo são colocadas as informações sobre o banco de dados, envio de email e a chave para a criação de tokens.
Então escolha um lugar para colocar esse arquivo, por exemplo em /etc/name-app/config.yaml
Crie uma variável de ambiente que aponte para o local onde esse arquivo estará armazenado (no servidor, faço isso no gunicorn), no ambiente de desenvolvimento, no meu caso isso pode ser feito com o comando export:
export VARNAME='/path/to/file'
Esse comando pode ser colocado no seu arquivo ~/.bashrc, que vc cita.
Então no arquivo settings.py
do django, primeiro tento ver se a variável existe no sistema, se sim, carrego o arquivo a partir do caminho que ela aponta e atribuo os valores às variaveis, assim:
CONFIG = os.environ.get('VARNAME')
try:
with open(CONFIG, 'r') as f:
settings = yaml.safe_load(f)
except IOError as e:
print("I/O error({0}): {1}".format(e.errno, e.strerror))
raise
except:
print("Erro inesperado", sys.exc_info())
print("Erro inesperado", sys.exc_info()[0])
raise
# To send email
EMAIL_HOST = settings['email_host']
EMAIL_PORT = settings['email_port']
EMAIL_HOST_USER = settings['email_host_user']
EMAIL_FROM = settings['email_host_user']
EMAIL_HOST_PASSWORD = settings['email_host_password']
EMAIL_USE_TLS = settings['use_tls']
SECRET_KEY = settings['key']
DATABASES = settings['db']
Essencialmente, é isso, não importa se seu servidor ou ambiente de desenvolvimento está na maquina fisica, em uma máquina virtual ou em um container docker.
Se não estiver claro, diga que tento melhorar a resposta.
Correct answer by Sidon on January 15, 2021
Você pode usar o python-decouple, com ele é possivel inserir os dados no settings.py.. puxando dados de um arquivo externo .env ou .ini na qual você declara strings constantes como no exemplo abaixo:
#nome_do_projeto/setting.py
from decouple import config
DEBUG = config('DEBUG', default=False, cast=bool)#a opção cast declara o tipo.
SECRET_KEY = config('SECRET_KEY')
ao invés de:
DEBUG=TRUE
SECRET_KEY = "sejalqualforakey"
e dentro do arquivo .env:
#raiz_do_projeto/.env:
DEBUG=TRUE
SECRET_KEY=sejalqualforakey
e caso você precise inserir uma lista por exemplo em ALLOWED_HOSTS:
ALLOWED_HOSTS = config('ALLOWED_HOSTS', default=[], cast=Csv())
aqui o cast contem um método Csv que precisa ser importado em:
from decouple import config, Csv
e no .env:
ALLOWED_HOSTS=127.0.0.1, .localhost
Answered by José Augusto on January 15, 2021
Gosto de usar o python decouple pra fazer isso
Tem um tutorial aqui
Answered by Italo Lemos on January 15, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP