Estou desenvolvendo um aplicativo básico. Agora, no estágio de implantação, ficou claro que eu preciso de configurações locais e de produção.
Seria ótimo saber o seguinte:
- Qual a melhor forma de lidar com as configurações de desenvolvimento e produção.
- Como manter aplicativos como o django-debug-toolbar apenas em um ambiente de desenvolvimento.
- Quaisquer outras dicas e práticas recomendadas para configurações de desenvolvimento e implantação.
Respostas:
A
DJANGO_SETTINGS_MODULE
variável de ambiente controla quais arquivos de configuração o Django carregará.Portanto, você cria arquivos de configuração separados para seus respectivos ambientes (observe que eles podem, obviamente, a
import *
partir de um arquivo separado "de configurações compartilhadas") e use-osDJANGO_SETTINGS_MODULE
para controlar qual deles usar.Aqui está como:
Conforme observado na documentação do Django:
Então, vamos assumir que você criou
myapp/production_settings.py
emyapp/test_settings.py
no seu repositório de origem.Nesse caso, você configuraria, respectivamente,
DJANGO_SETTINGS_MODULE=myapp.production_settings
o primeiro eDJANGO_SETTINGS_MODULE=myapp.test_settings
o último.Daqui em diante, o problema se resume a definir a
DJANGO_SETTINGS_MODULE
variável de ambiente.Configurando
DJANGO_SETTINGS_MODULE
Usando um Script ou ShellEntão você pode usar um script de inicialização ou um gerente de processo para carregar as configurações corretas (definindo o meio ambiente), ou apenas executá-lo a partir do seu shell antes de iniciar Django:
export DJANGO_SETTINGS_MODULE=myapp.production_settings
.Observe que você pode executar essa exportação a qualquer momento a partir de um shell - ele não precisa viver no seu
.bashrc
ou em nada.Configurando
DJANGO_SETTINGS_MODULE
Usando um Process ManagerSe você não gosta de escrever um script de auto-inicialização que define o ambiente (e há boas razões para se sentir assim!), Eu recomendaria o uso de um gerenciador de processos:
environment
chave de configuração de um programa ..env
arquivo "environment" ( ) .Por fim, observe que você pode tirar proveito da
PYTHONPATH
variável para armazenar as configurações em um local completamente diferente (por exemplo, em um servidor de produção, armazenando-as/etc/
). Isso permite separar a configuração dos arquivos do aplicativo. Você pode ou não querer isso, depende de como seu aplicativo está estruturado.fonte
settings.py
arquivo é armazenadoSiteName/settings.py
por padrão, se você colocar seus arquivos de configuração alternativos no mesmo diretório, a linha adicionada ao bin / enable deve lerDJANGO_SETTINGS_MODULE="SiteName.test_settings"
Caso contrário, excelente resposta!DJANGO_SETTINGS_MODULE
para escolher o que você deseja usar. Modificarbin/activate
é o de fazer o último (TBH, eu não acho mais uma boa ideia, então tirei isso), mas não é o único.Por padrão, use as configurações de produção, mas crie um arquivo chamado
settings_dev.py
na mesma pasta que o seusettings.py
arquivo. Adicione substituições lá, comoDEBUG=True
.No computador que será usado para o desenvolvimento, adicione isso ao seu
~/.bashrc
arquivo:Na parte inferior do seu
settings.py
arquivo, adicione o seguinte.(Observe que a importação
*
geralmente deve ser evitada no Python)Por padrão, os servidores de produção não substituem nada. Feito!
Comparado com as outras respostas, essa é mais simples porque não requer atualização
PYTHONPATH
ou configuraçãoDJANGO_SETTINGS_MODULE
que permite apenas trabalhar em um projeto de django por vez.fonte
if os.environ.get('DJANGO_DEVELOPMENT', 'true')
também funciona. Menciono isso apenas porque ois not true
método acima falhou ao importar para mim no Python 3.6.DEV
configurações que vazarão dados particulares em um servidor público. Você realmente quer apenas verificar se aDJANGO_DEVELOPMENT
variável de ambiente existe (ou sejais not None
).settings_dev.py
estava carregando no servidor.is not None
cheque. Tambémos.getenv
é a abreviaçãoNormalmente, tenho um arquivo de configurações por ambiente e um arquivo de configurações compartilhado:
Cada um dos meus arquivos de ambiente possui:
Isso me permite substituir as configurações compartilhadas, se necessário (adicionando as modificações abaixo dessa estrofe).
Depois, seleciono quais arquivos de configuração usar vinculando-o a settings.py:
fonte
import *
? Você desabilita essa verificação? Eu envolto esta importação em umaexec()
, mas em seguida, eu não posso ter condicionais em variáveis que não estão definidos neste arquivo, nem posso alterINSTALLED_APPS
variável porque é "indefinido"É assim que eu faço em 6 etapas fáceis:
Crie uma pasta dentro do diretório do projeto e nomeie-a
settings
.Estrutura do projeto:
Crie quatro arquivos python dentro do
settings
diretório__init__.py
, a saberbase.py
,dev.py
eprod.py
Arquivos de configurações:
Abra
__init__.py
e preencha com o seguinte conteúdo:init .py:
Abra
base.py
e preencha-o com todas as configurações comuns (que serão usadas tanto na produção quanto no desenvolvimento.), Por exemplo:base.py:
Abra
dev.py
e inclua os itens específicos do desenvolvimento, por exemplo:dev.py:
Abra
prod.py
e inclua os itens específicos da produção, por exemplo:prod.py:
fonte
Crie vários
settings*.py
arquivos, extrapolando as variáveis que precisam ser alteradas por ambiente. Depois, no final do seusettings.py
arquivo mestre :Você mantém os
settings_*
arquivos separados para cada estágio.Na parte superior do seu
settings_dev.py
arquivo, adicione este:Para importar variáveis que você precisa modificar.
Esta entrada do wiki tem mais ideias sobre como dividir suas configurações.
fonte
settings_prod.py
modname = "%s.settings" % ".".join(__name__.split('.')[:-1])
para obter o nome completo do módulo e, em seguidaglobals().update(vars(sys.modules[modname]))
. Acho que funciona muito bem para mim. É claro que deixar de lado a questão de determinar programaticamente o nome do módulo em favor de uma string provavelmente também funcionaria na maioria dos casos.Eu uso as incríveis configurações de django e todas as configurações são armazenadas no meu
settings.py
:Para configurar o projeto Django, apenas segui os documentos .
fonte
Aqui está a abordagem que usamos:
settings
módulo para dividir as configurações em vários arquivos para facilitar a leitura;.env.json
arquivo para armazenar credenciais e parâmetros que queremos excluir do repositório git ou que são específicos do ambiente;env.py
arquivo para ler o.env.json
arquivoConsiderando a seguinte estrutura:
Com
.env.json
como:E
project_name/env.py
:Podemos ter as seguintes configurações:
Os benefícios desta solução são:
.env.json
como dev, stagging e produção;Espero que isso ajude, deixe-me saber se você vê alguma ressalva com esta solução.
fonte
env
substituirdev
,prod
etc.? O que se passa nosettings.py
arquivo antigo ? O que hástorage.py
edatabase.py
?env.py
arquivo para que o seu pode escolher, com uma variável de ambiente, que arquivo para cargaEu uso a estrutura de arquivo de acompanhamento:
Então
__init__.py
é um link (ln em UNIX ou mklink no Windows) paralocal.py
ou pode ser paraprod.py
que a configuração ainda está noproject.settings
módulo é limpo e organizado, e se você quiser usar uma configuração especial que você pode usar a variável de ambienteDJANGO_SETTINGS_MODULE
paraproject.settings.prod
se precisar para executar um comando para o ambiente de produção.Nos arquivos
prod.py
elocal.py
:e o
shared.py
arquivo é mantido como global sem configurações específicas.fonte
desenvolvendo a resposta do cs01:
se você estiver tendo problemas com a variável de ambiente, defina seu valor como uma string (por exemplo, eu fiz
DJANGO_DEVELOPMENT="true"
).Também alterei o fluxo de trabalho do arquivo cs01 da seguinte maneira:
Dessa forma, o Django não precisa ler a totalidade de um arquivo de configurações antes de executar o arquivo de configurações apropriado. Esta solução é útil se o seu arquivo de produção precisar de coisas que estão apenas no seu servidor de produção.
Nota: no Python 3, os arquivos importados precisam ter um
.
anexo (por exemplofrom .settings_dev import *
)fonte
Se você deseja manter 1 arquivo de configurações e seu sistema operacional de desenvolvimento é diferente do sistema operacional de produção, coloque-o na parte inferior de suas configurações.py:
Leia mais: Como verifico o sistema operacional em Python?
fonte
Isso parece ter sido respondido, no entanto, um método que eu uso como combinado com o controle de versão é o seguinte:
Configure um arquivo env.py no mesmo diretório que as configurações no meu ambiente de desenvolvimento local que eu também adiciono ao .gitignore:
env.py:
.gitignore:
settings.py:
Acabei de achar que isso funciona e é muito mais elegante - com o env.py é fácil ver nossas variáveis de ambiente local e podemos lidar com tudo isso sem vários arquivos settings.py ou coisas do tipo. Esse método permite que todos os tipos de variáveis de ambiente local sejam utilizados que não desejamos definir em nosso servidor de produção. Utilizando o .gitignore via controle de versão, também mantemos tudo perfeitamente integrado.
fonte
Config
classe dentro doenv.py
arquivo. Em vez de umimport *
, o módulo pode ser importado porfrom env import Config
. Dessa forma, você também não precisa usar isso seos.path
verificar, o que torna tudo mais simples.Use
settings.py
para produção. No mesmo diretório, criesettings_dev.py
para substituições.Em uma máquina de desenvolvimento, execute seu aplicativo Django com:
Em uma máquina de prod, execute como se você tivesse
settings.py
e nada mais.VANTAGENS
settings.py
(usado para produção) é completamente independente do fato de que outros ambientes existem.settings_dev.py
. Não há necessidade de reunir configurações espalhadas porsettings_prod.py
,settings_dev.py
esettings_shared.py
.fonte
Para o problema de configurar arquivos, eu escolho copiar
Quando você executa o django, __init__py será executado. Neste momento,
settings.py in setting1_dir
irá substituirsettings.py in Project
.Como escolher um ambiente diferente?
__init__.py
diretamente.__init__.py
.__init__.py
ler esta variável.Por que usar dessa maneira?
Como não gosto de tantos arquivos no mesmo diretório, muitos arquivos confundem outros parceiros e não muito bem para o IDE (o IDE não consegue encontrar o arquivo que usamos)
Se você não deseja ver todos esses detalhes, pode dividir o projeto em duas partes.
fonte
Estou usando um arquivo app.yaml diferente para alterar a configuração entre ambientes no Google Cloud App Engine.
Você pode usar isso para criar uma conexão proxy no seu comando do terminal:
https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy#macos-64-bit
Arquivo: app.yaml
fonte
Esta é a minha solução, com diferentes ambientes para dev, test e prod
fonte