Como você configurar o Django para o desenvolvimento e implantação simples?

votos
107

I tendem a usar SQLite ao fazer Django desenvolvimento, mas em um servidor algo vivo mais robusto é muitas vezes necessário ( MySQL / PostgreSQL , por exemplo). Invariavelmente, há outras alterações a fazer às configurações do Django, bem como: diferentes madeireiras locais / intensidades, caminhos de mídia, etc.

Como você gerenciar todas essas mudanças para tornar a implantação de um processo simples e automatizado?

Publicado 17/09/2008 em 23:16
fonte usuário
Em outras línguas...                            


14 respostas

votos
83

Update: django-configurações foi lançado, que é provavelmente a melhor opção para a maioria das pessoas do que fazê-lo manualmente.

Se você preferir fazer as coisas manualmente, a minha resposta anterior ainda se aplica:

Eu tenho vários arquivos de configurações.

  • settings_local.py - configuração específica do host, tais como nome do banco, caminhos de arquivo, etc.
  • settings_development.py- configuração utilizada para o desenvolvimento, por exemplo DEBUG = True.
  • settings_production.py- configuração utilizada para a produção de, por exemplo SERVER_EMAIL.

Eu amarro todos estes juntamente com um settings.pyarquivo que em primeiro lugar as importações settings_local.py, e, em seguida, um dos outros dois. Ele decide qual carregar por duas configurações dentro settings_local.py- DEVELOPMENT_HOSTSe PRODUCTION_HOSTS. settings.pychama platform.node()para encontrar o nome da máquina que está sendo executado e, em seguida olha para esse hostname nas listas, e carrega o segundo arquivo de configurações, dependendo em qual delas ele encontra o nome do host no.

Dessa forma, a única coisa que você realmente precisa se preocupar é manter o settings_local.pyarquivo atualizado com a configuração específica do host, e tudo o resto é feito automaticamente.

Veja um exemplo aqui .

Respondeu 17/09/2008 em 23:27
fonte usuário

votos
25

Pessoalmente, eu uso um único settings.py para o projeto, eu só tenho que procurar o hostname é no (minhas máquinas de desenvolvimento têm nomes de máquinas que começam com "gabriel", então eu só tenho este:

import socket
if socket.gethostname().startswith('gabriel'):
    LIVEHOST = False
else: 
    LIVEHOST = True

em seguida, em outras partes tenho coisas como:

if LIVEHOST:
    DEBUG = False
    PREPEND_WWW = True
    MEDIA_URL = 'http://static1.grsites.com/'
else:
    DEBUG = True
    PREPEND_WWW = False
    MEDIA_URL = 'http://localhost:8000/static/'

e assim por diante. Um pouco menos legível, mas ele funciona bem e evita ter que fazer malabarismos vários arquivos de configurações.

Respondeu 18/09/2008 em 04:45
fonte usuário

votos
21

No final do settings.py eu tenho a seguinte:

try:
    from settings_local import *
except ImportError:
    pass

Desta forma, se eu quiser substituir as configurações padrão Eu preciso apenas colocar settings_local.py ao lado settings.py.

Respondeu 18/09/2008 em 11:57
fonte usuário

votos
11

Eu tenho dois arquivos. settings_base.pyque contém configurações comum / padrão e que é verificado no controle de origem. Cada implantação tem uma separado settings.py, o qual executa from settings_base import *, no início e em seguida, substitui conforme necessário.

Respondeu 17/09/2008 em 23:29
fonte usuário

votos
7

A maneira mais simples que eu encontrei foi:

1) usar o padrão settings.py para o desenvolvimento local e 2) criar um production-settings.py começando com:

import os
from settings import *

E depois é só substituir as configurações que diferem na produção:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}
Respondeu 08/07/2010 em 08:38
fonte usuário

votos
2

Algo relacionado, para a questão da implantação em si Django com vários bancos de dados, você pode querer dar uma olhada em Djangostack . Você pode baixar um instalador totalmente gratuito que permite que você instale Apache, Python, Django, etc. Como parte do processo de instalação que permitem que você selecione qual banco de dados que você deseja usar (MySQL, SQLite, PostgreSQL). Nós usamos os instaladores extensivamente ao automatizar implementações internamente (que pode ser executado em modo automático).

Respondeu 27/07/2011 em 16:20
fonte usuário

votos
1

Bem, eu uso esta configuração:

No final de settings.py:

#settings.py
try:
    from locale_settings import *
except ImportError:
    pass

E em locale_settings.py:

#locale_settings.py
class Settings(object):

    def __init__(self):
        import settings
        self.settings = settings

    def __getattr__(self, name):
        return getattr(self.settings, name)

settings = Settings()

INSTALLED_APPS = settings.INSTALLED_APPS + (
    'gunicorn',)

# Delete duplicate settings maybe not needed, but I prefer to do it.
del settings
del Settings
Respondeu 13/08/2011 em 01:16
fonte usuário

votos
1

Eu tenho meu arquivo settings.py em um diretório externo. Dessa forma, ele não é verificado no controle de origem, ou sobre-escrito por um deploy. Eu coloquei isso no arquivo settings.py sob meu projeto Django, juntamente com todas as configurações padrão:

import sys
import os.path

def _load_settings(path):    
    print "Loading configuration from %s" % (path)
    if os.path.exists(path):
    settings = {}
    # execfile can't modify globals directly, so we will load them manually
    execfile(path, globals(), settings)
    for setting in settings:
        globals()[setting] = settings[setting]

_load_settings("/usr/local/conf/local_settings.py")

Nota: Isto é muito perigoso se você não pode confiar local_settings.py.

Respondeu 06/10/2009 em 19:22
fonte usuário

votos
1

Além dos arquivos de múltiplas configurações mencionadas por Jim, eu também tendem a colocar duas configurações no meu arquivo settings.py no topo BASE_DIRe BASE_URLdefinido para o caminho do código e o URL para a base do site, todas as outras configurações são modificadas para anexar-se a estes.

BASE_DIR = "/home/sean/myapp/" por exemplo MEDIA_ROOT = "%smedia/" % BASEDIR

Então, quando mover o projeto eu só tenho que editar essas configurações e não procurar o arquivo inteiro.

Eu recomendaria também olhando para tecido e Capistrano (ferramenta de Ruby, mas ele pode ser usado para implantar aplicativos Django) que facilitam a automação de implantação remota.

Respondeu 18/09/2008 em 02:59
fonte usuário

votos
0

Este é um posto mais velhos, mas eu acho que se eu adicionar este útil libraryele irá simplificar as coisas.

Use django-configuração

Começo rápido

pip install django-configurations

Então subclasse da classe configurations.Configuration incluído no settings.py do seu projeto ou qualquer outro módulo que você está usando para armazenar as constantes configurações, por exemplo:

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

Defina a DJANGO_CONFIGURATIONvariável de ambiente para o nome da classe que você acabou de criar, por exemplo, em ~/.bashrc:

export DJANGO_CONFIGURATION=Dev

e a DJANGO_SETTINGS_MODULEvariável de ambiente para o caminho do módulo de importação, como de costume, por exemplo, em festa:

export DJANGO_SETTINGS_MODULE=mysite.settings

Alternativamente fornecer a --configurationopção ao usar comandos de gerenciamento de Django ao longo das linhas de padrão do Django --settingsopção de linha de comando, por exemplo:

python manage.py runserver --settings=mysite.settings --configuration=Dev

Para habilitar Django usar sua configuração agora você tem que modificar seu manage.py ou wsgi.py script para usar versões das funções de partida apropriados, por exemplo, um típico django-configurações manage.py usando django-configurações ficaria assim:

#!/usr/bin/env python

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
    os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

    from configurations.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Observe na linha 10 não usamos a ferramenta comum django.core.management.execute_from_command_line, mas em vez disso configurations.management.execute_from_command_line.

O mesmo se aplica ao seu wsgi.py arquivo, por exemplo:

import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

from configurations.wsgi import get_wsgi_application

application = get_wsgi_application()

Aqui nós não usar o padrão django.core.wsgi.get_wsgi_applicationfunção, mas em vez disso configurations.wsgi.get_wsgi_application.

É isso aí! Agora você pode usar seu projeto com manage.py e seu servidor habilitado WSGI favorito.

Respondeu 10/05/2018 em 21:38
fonte usuário

votos
0

Tantas respostas complicadas!

Cada arquivo settings.py vem com:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

Eu uso esse diretório para definir a variável DEBUG como este (reaplace com o directoy onde seu código dev é):

DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
    DEBUG = True

Então, cada vez que o arquivo settings.py é movido, DEBUG será falso e é o seu ambiente de produção.

Toda vez que você precisar de configurações diferentes do que aqueles em seu ambiente dev apenas usar:

if(DEBUG):
    #Debug setting
else:
    #Release setting
Respondeu 22/02/2018 em 22:02
fonte usuário

votos
0

I usar o ambiente:

if os.environ.get('WEB_MODE', None) == 'production' :
   from settings_production import *
else :
   from settings_dev import *

Creio que esta é uma abordagem muito melhor, porque eventualmente você precisar de configurações especiais para o seu ambiente de teste, e você pode facilmente adicioná-lo a esta condição.

Respondeu 14/03/2012 em 03:04
fonte usuário

votos
0

Eu acho que depende do tamanho do local para saber se você precisa intensificar a partir usando SQLite, eu usei com sucesso SQLite em vários sites ao vivo menores e funciona grande.

Respondeu 20/09/2008 em 16:37
fonte usuário

votos
-2

Na verdade, você provavelmente deve considerar ter o mesmo (ou quase o mesmo) configurações para o seu desenvolvimento e ambiente de produção. Caso contrário, situações como "Hey, ele funciona na minha máquina" vai acontecer de tempos em tempos.

Assim, a fim de automatizar a implantação e eliminar esses problemas WOMM, basta usar Docker .

Respondeu 22/12/2016 em 14:36
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more