Eu costumo usar SQLite ao fazer desenvolvimento em Django , mas em um servidor ativo, algo mais robusto geralmente é necessário ( MySQL / PostgreSQL , por exemplo). Invariavelmente, há outras mudanças a serem feitas nas configurações do Django: diferentes locais / intensidades de registro, caminhos de mídia, etc.
Como você gerencia todas essas mudanças para tornar a implantação um processo simples e automatizado?
Respostas:
Atualização: django-configurations foi lançado, o que é provavelmente uma opção melhor para a maioria das pessoas do que manualmente.
Se você preferir fazer as coisas manualmente, minha resposta anterior ainda se aplica:
Eu tenho vários arquivos de configurações.
settings_local.py
- configuração específica do host, como nome do banco de dados, caminhos de arquivo, etc.settings_development.py
- configuração usada para desenvolvimento, por exemploDEBUG = True
.settings_production.py
- configuração usada para produção, por exemploSERVER_EMAIL
.Eu amarro tudo isso junto com um
settings.py
arquivo que primeiro importasettings_local.py
e depois um dos outros dois. Ele decide qual carregar por duas configurações internassettings_local.py
-DEVELOPMENT_HOSTS
ePRODUCTION_HOSTS
.settings.py
chamaplatform.node()
para encontrar o nome do host da máquina em que está sendo executado e, em seguida, procura por esse nome de host nas listas e carrega o segundo arquivo de configurações, dependendo da lista em que ele encontra o nome do host.Dessa forma, a única coisa com que você realmente precisa se preocupar é manter o
settings_local.py
arquivo atualizado com a configuração específica do host, e todo o resto é tratado automaticamente.Veja um exemplo aqui .
fonte
_local
um tanto confuso) e o fato de que você não está usando módulos (configurações /base.py, settings / local.py, settings / production.py). Também seria sensato manter isso em um repositório separado ... melhor ainda, um serviço seguro que fornece essas informações de uma fonte canônica (provavelmente um exagero para a maioria) ... para que o novo host não exija um novo lançamento..py
arquivo e, assim, dar a cada host acesso às informações sobre a configuração de todos os outros hosts, você pode modelar o manage.py para usar as configurações apropriadas arquivo em suas configurações de implantação.Pessoalmente, eu uso um único settings.py para o projeto, apenas peço que pesquise o nome do host em que está (minhas máquinas de desenvolvimento têm nomes de host que começam com "gabriel", então tenho apenas isto:
em outras partes, tenho coisas como:
e assim por diante. Um pouco menos legível, mas funciona bem e evita ter que manipular vários arquivos de configurações.
fonte
No final de settings.py, tenho o seguinte:
Dessa forma, se eu quiser substituir as configurações padrão, preciso apenas colocar settings_local.py ao lado de settings.py.
fonte
settings_local
resultar em umImportError
,except
ele o engolirá silenciosamente.No module named...
vscannot import name...
, mas é frágil. Ou coloque suas importações em settings_local.py em blocos try e gere uma exceção mais específica:MisconfiguredSettings
ou algo nesse sentido.Eu tenho dois arquivos.
settings_base.py
que contém configurações comuns / padrão e que são verificadas no controle de origem. Cada implantação possui um separadosettings.py
, que é executadofrom settings_base import *
no início e, em seguida, substitui conforme necessário.fonte
settings_local.py
fizer issofrom settings import *
, ele pode substituir os valores emsettings.py
. (osettings_local.py
arquivo deve ser importado no finalsettings.py
).A maneira mais simplista que encontrei foi:
1) use o settings.py padrão para desenvolvimento local e 2) crie um production-settings.py começando com:
Em seguida, basta substituir as configurações que diferem na produção:
fonte
Algo relacionado, para o problema de implantar o próprio Django com múltiplos bancos de dados, você pode querer dar uma olhada no Djangostack . Você pode baixar um instalador totalmente gratuito que permite instalar Apache, Python, Django, etc. Como parte do processo de instalação, permitimos que você selecione qual banco de dados deseja usar (MySQL, SQLite, PostgreSQL). Usamos os instaladores extensivamente ao automatizar implantações internamente (eles podem ser executados no modo autônomo).
fonte
Tenho meu arquivo settings.py em um diretório externo. Dessa forma, ele não é verificado no controle de origem ou sobrescrito por uma implantação. Coloquei isso no arquivo settings.py em meu projeto Django, junto com todas as configurações padrão:
Observação: isso é muito perigoso se você não confiar em local_settings.py.
fonte
Além dos vários arquivos de configurações mencionados por Jim, também costumo colocar duas configurações em meu arquivo settings.py na parte superior
BASE_DIR
eBASE_URL
definir como o caminho do código e a URL para a base do site, todas as outras configurações são modificadas para se anexar a estes.BASE_DIR = "/home/sean/myapp/"
por exemploMEDIA_ROOT = "%smedia/" % BASEDIR
Portanto, ao mover o projeto, só preciso editar essas configurações e não pesquisar o arquivo inteiro.
Eu também recomendaria olhar o fabric e o Capistrano (ferramenta Ruby, mas pode ser usado para implantar aplicativos Django), que facilitam a automação da implantação remota.
fonte
Bem, eu uso esta configuração:
No final de settings.py:
E em locale_settings.py:
fonte
Tantas respostas complicadas!
Cada arquivo settings.py vem com:
Eu uso esse diretório para definir a variável DEBUG assim (substitua com o diretório onde está seu código de desenvolvimento):
Então, toda vez que o arquivo settings.py for movido, DEBUG será False e será o seu ambiente de produção.
Sempre que você precisar de configurações diferentes das do seu ambiente de desenvolvimento, use:
fonte
Acho que depende do tamanho do site se você precisa intensificar o uso do SQLite. Usei o SQLite com sucesso em vários sites ativos menores e ele funciona muito bem.
fonte
Eu uso o ambiente:
Eu acredito que esta é uma abordagem muito melhor, porque eventualmente você precisa de configurações especiais para seu ambiente de teste e você pode facilmente adicioná-las a essa condição.
fonte
Este é um post mais antigo, mas acho que se adicionar este útil,
library
isso simplificará as coisas.Use a configuração django
Começo rápido
Em seguida, subclasse a classe configurations.Configuration incluída em settings.py do seu projeto ou qualquer outro módulo que você esteja usando para armazenar as constantes de configurações, por exemplo:
Defina a
DJANGO_CONFIGURATION
variável de ambiente com o nome da classe que você acabou de criar, por exemplo, em~/.bashrc
:export DJANGO_CONFIGURATION=Dev
e a
DJANGO_SETTINGS_MODULE
variável de ambiente para o caminho de importação do módulo como de costume, por exemplo, em bash:export DJANGO_SETTINGS_MODULE=mysite.settings
Alternativamente, forneça a
--configuration
opção ao usar comandos de gerenciamento do Django ao longo das linhas da--settings
opção de linha de comando padrão do Django , por exemplo:python manage.py runserver --settings=mysite.settings --configuration=Dev
Para habilitar o Django a usar sua configuração, você agora tem que modificar seu script manage.py ou wsgi.py para usar as versões do django-configurations das funções iniciais apropriadas, por exemplo, um manage.py típico usando django-configurations ficaria assim:
Observe na linha 10 que não usamos a ferramenta comum,
django.core.management.execute_from_command_line
mas simconfigurations.management.execute_from_command_line
.O mesmo se aplica ao seu arquivo wsgi.py , por exemplo:
Aqui não usamos a
django.core.wsgi.get_wsgi_application
função padrão , mas simconfigurations.wsgi.get_wsgi_application
.É isso aí! Agora você pode usar seu projeto com manage.py e seu servidor habilitado para WSGI favorito.
fonte
Na verdade, você provavelmente deve considerar ter as mesmas (ou quase as mesmas) configurações para seu ambiente de desenvolvimento e produção. Caso contrário, situações como "Ei, funciona na minha máquina" acontecerão de vez em quando.
Portanto, para automatizar sua implantação e eliminar esses problemas de WOMM, basta usar o Docker .
fonte