Opa, hoje vamos organizar nossos settings de desenvolvimento, produção e testes.

Criando o settings de desenvolvimento.

Entre no diretório do projeto, para maiores detalhes acompanhe o post anterior.

lucas@lucas-Inspiron-1525 ~/workspace-django/pywatch.com.br/pywatch/settings [master *]
± % ls
base.py

Crie o arquivo dev.py neste diretório. Abra-o e vamos edita-lo.

  1 from .base import *
  2 from decouple import Config
  3 import dj_database_url
  4
  5
  6 DEBUG = True
  7
  8 TEMPLATE_DEBUG = DEBUG
  9
 10 COMPRESS_ENABLED = not DEBUG

Linha 1: Importamos todas as configurações do nosso arquivo base.py

Linha 2: Importamos o Config do pacote django-decouple

Linha 3: Importamos o dj_database_url

Linha 6: Setamos o DEBUG para True

Linha 8: Setamos o TEMPLATE_DEBUG para o valor do DEBUG

Linha 10: Desabilitamos o COMPRESS

 13 config = Config(PROJECT_DIR.child('confs')+'/settings.ini')

Criando o settings.ini

Vamos colocar algumas de nossas configurações em um arquivo único.

Vá para a raiz do seu projeto e crie o dirétorio confs/

lucas@lucas-Inspiron-1525 ~/workspace-django/pywatch.com.br [master *]
± % mkdir confs

(pywatch)
lucas@lucas-Inspiron-1525 ~/workspace-django/pywatch.com.br [master *]
± % cd confs

(pywatch)
lucas@lucas-Inspiron-1525 ~/workspace-django/pywatch.com.br/confs [master *]
± % touch settings.ini

Edite o arquivo em settings.ini e insira as chaves-valores abaixo.

  1 [settings]
  2
  3 DATABASE_URL=postgres://postgres:postgres@localhost:5432/pywatch
  4 DATABASE_TEST_URL=postgres://postgres:postgres@localhost:5432/test_pywatch
  5 EMAIL_HOST=
  6 EMAIL_HOST_USER=
  7 EMAIL_HOST_PASSWORD=
  8 EMAIL_PORT=
  9 EMAIL_USE_TLS=
 10 AWS_STORAGE_BUCKET_NAME=
 11 AWS_ACCESS_KEY_ID=
 12 AWS_SECRET_ACCESS_KEY=
 13 RAVEN_DSN=

As mais importantes são o DATABASE_URL, para acesso ao banco de dados, utilizado pelo dj_database_url. O mesmo para a chave DATABASE_TEST_URL. As outras são opcionais caso voce queira usar.

Esse arquivo será utilizado também em produção e para testes.

Voltando ao settings/dev.py

Agora vamos configurar o restante do arquivo dev.py.

Abaixo segue as configurações de email utilizadas em desenvolvimento. As opcões de configuração podem ser escritas no arquivo settings.ini. Mas lembre-se que em produção essas alteracoes serão alteradas.

##########  MAILTRAP CONFIGURATION

EMAIL_HOST = config('EMAIL_HOST')
EMAIL_HOST_USER = config('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD')
EMAIL_PORT = config('EMAIL_PORT')
EMAIL_USE_TLS = config('EMAIL_USE_TLS')

##########  END MAILTRAP CONFIGURATION

Abaixo temos a configuração do banco de dados. Vej aq utilizamos o pacote dj_database_url para setar a configuração, ao invés do dicionário que o Django nos oferece por padrão. Simplificando ainda mais passamos a configuração config('DATABASE_URL').

Se seu ambiente de desenvolvimento possui nome e usuarios diferentes altere o arquivo settings.ini.

########## DATABASE CONFIGURATION
DATABASES = {
    'default': dj_database_url.config(
        default=config('DATABASE_URL')
    )
}
########## END DATABASE CONFIGURATION

Agora vamos colocar as apps instaladas para o desenvolvimento. Atualmente, estou utilizando somente o debug_toolbar.

########## INSTALLED APPS CONFIGURATION

INSTALLED_APPS += (
    'debug_toolbar',
)

Configurando o CACHE e o DEBUG_TOOLBAR

########## CACHE CONFIGURATION
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}
########## END CACHE CONFIGURATION

# IPs allowed to see django-debug-toolbar output.
INTERNAL_IPS = ("127.0.0.1",)


MIDDLEWARE_CLASSES += \
    ("debug_toolbar.middleware.DebugToolbarMiddleware", )


DEBUG_TOOLBAR_CONFIG = {
    # If set to True (default), the debug toolbar will show an intermediate
    # page upon redirect so you can view any debug information prior to
    # redirecting. This page will provide a link to the redirect
    # destination
    # you can follow when ready. If set to False, redirects will proceed as
    # normal.
    'INTERCEPT_REDIRECTS': False,

    # If not set or set to None, the debug_toolbar middleware will use its
    # built-in show_toolbar method for determining whether the toolbar
    # should
    # show or not. The default checks are that DEBUG must be set to True
    # and
    # the IP of the request must be in INTERNAL_IPS. You can provide your
    # own
    # method for displaying the toolbar which contains your custom logic.
    # This
    # method should return True or False.
    'SHOW_TOOLBAR_CALLBACK': None,

    # An array of custom signals that might be in your project, defined as
    # the
    # python path to the signal.
    'EXTRA_SIGNALS': [],

    # If set to True (the default) then code in Django itself won't be
    # shown in
    # SQL stacktraces.
    'HIDE_DJANGO_SQL': True,

    # If set to True (the default) then a template's context will be
    # included
    # with it in the Template debug panel. Turning this off is useful when
    # you
    # have large template contexts, or you have template contexts with lazy
    # datastructures that you don't want to be evaluated.
    'SHOW_TEMPLATE_CONTEXT': True,

    # If set, this will be the tag to which debug_toolbar will attach the
    # debug
    # toolbar. Defaults to 'body'.
    'TAG': 'body',
}
########## END DJANGO-DEBUG-TOOLBAR CONFIGURATION

Finalizamos nossas configurações de desenvolvimento.

Um ponto importante, se voce deseja ter mais de um arquivo de desenvolvimento para cada desenvolvedor, basta importar o arquivo dev.py e sobreescrever as definições particulares de cada desenvolvedor.

Por exemplo:

from .dev import *
DATABASES = {
  'default': {
  ¦   'ENGINE': 'django.db.backends.postgresql_psycopg2',
    ¦   'NAME': 'db_pywatch',
    ¦   'USER': 'pywatch',
    ¦   'PASSWORD': 'pywatch123',
    ¦   'HOST': '1.1.1.1',
    ¦   'PORT': '5432',
    }
 }

Acima utilizei o a configuração padrão do Django. Nada impede de utilizar o dj_database_url.

Criando o settings de testes.

Crie o arquivo tests.py neste diretório. Abra-o e vamos edita-lo.

  1 from base import *
  2 from decouple import Config
  3 import dj_database_url
  4
  5 config = Config(PROJECT_DIR.child('confs')+'/settings.ini')
  6
  7 ########## TEST SETTINGS
  8 TEST_RUNNER = "discover_runner.DiscoverRunner"
  9 TEST_DISCOVER_TOP_LEVEL = PROJECT_DIR
 10 TEST_DISCOVER_ROOT = PROJECT_DIR
 11 TEST_DISCOVER_PATTERN = "test_*"
 12 ########## END TEST SETTINGS
 13
 14
 15 ########## DATABASE CONFIGURATION¬
 16 DATABASES = {
 17     'default': dj_database_url.config(
 18     ¦   default=config('DATABASE_TEST_URL')
 19     )
 20 }
 21 ########## END DATABASE CONFIGURATION¬

Para o arquivo de testes, inserimos algumas poucas configurações. Como o descobrimento de arquivos test_* e o banco de dados utilizado pela configuração config('DATABASE_TEST_URL').

O arquivo de staging.py, pode conter as mesmas configurações do arquivo de test.py.

Agora o settings de produção.

Crie o arquivo production.py neste diretório. Abra-o e vamos edita-lo.

from .base import *
from decouple import Config
import dj_database_url


config = Config(PROJECT_DIR.child('confs')+'/settings.ini')

##########  MAILTRAP CONFIGURATION

EMAIL_HOST = config('EMAIL_HOST')
EMAIL_HOST_USER = config('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD')
EMAIL_PORT = config('EMAIL_PORT')
EMAIL_USE_TLS = config('EMAIL_USE_TLS')

##########  END MAILTRAP CONFIGURATION

########## DATABASE CONFIGURATION
DATABASES = {
    'default': dj_database_url.config(
        default=config('DATABASE_URL')
    )
}
########## END DATABASE CONFIGURATION

INSTALLED_APPS += (
    'gunicorn',
)

##########  AMAZON S3 CONFIGURATION

# 1 - Create the variables envoirement
# AWS_STORAGE_BUCKET_NAME='test'
# 2 - Export the varables
# export AWS_STORAGE_BUCKET_NAME
# 3 - Get the secret and access key in
# https://console.aws.amazon.com/iam/home?#security_credential

if not DEBUG:
    AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME')
    STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
    AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
    AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
    AWS_IS_GZIPPED = True
    AWS_QUERYSTRING_EXPIRE = 7200
    AWS_S3_SECURE_URLS = True
    STATIC_URL = S3_URL
########## END AMAZON S3 CONFIGURATION


##########  COMPRESS CONFIGURATION
if not DEBUG:
    COMPRESS_ENABLED = not DEBUG
    COMPRESS_OFFLINE = True
    COMPRESS_ROOT = STATIC_ROOT
    COMPRESS_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    COMPRESS_CSSTIDY_ARGUMENTS = '--template=highest --sort_properties=false --sort_selectors=false --merge_selectors=1'
    COMPRESS_URL = S3_URL
    COMPRESS_PRECOMPILERS = (
        ('text/coffeescript', 'coffee --compile --stdio'),
        ('text/less', 'lessc {infile} > {outfile}')
    )

##########  COMPRESS CONFIGURATION

# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ALLOWED_HOSTS = '*'

No arquivo de produção temos algumas alterações em particular.

Primeiro o GUNICORN no INSTALLED_APPS.

A configuração do AWS S3 da Amazon, e do Compress. Verificando se o DEBUG esta setado como False

Finalizando....

Após toda essa trabalheira, vamos executar nosso projeto com o settings de desenvolviemento.

Execute o comando abaixo, onde se localiza o arquivo manage.py.

lucas@lucas-Inspiron-1525 ~/workspace-django/pywatch.com.br [master *]
± % python manage.py syncdb --settings=pywatch.settings.dev

Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no):

O comando acima ira instalar as tabelas iniciais do Django e criar um usuário administrador.

Em seguida execute:

lucas@lucas-Inspiron-1525 ~/workspace-django/pywatch.com.br [master *]
± % python manage.py runserver --settings=pywatch.settings.dev

0 errors found
November 16, 2013 - 15:20:43
Django version 1.5.5, using settings 'pywatch.settings.dev'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Pronto!! Seu ambiente de desenvolvimento está pronto para ser utilizado.

No próximo post iremos exibir como organizar uma app.

Abraço a todos.

=)