Buscar..


Configuración de la zona horaria

Puedes establecer la zona horaria que usará Django en el archivo settings.py . Ejemplos:

TIME_ZONE = 'UTC'  # use this, whenever possible
TIME_ZONE = 'Europe/Berlin'
TIME_ZONE = 'Etc/GMT+1'

Aquí está la lista de zonas horarias válidas

Cuando se ejecuta en un entorno Windows , debe configurarse de la misma manera que la zona horaria del sistema .

Si no quieres que Django use tiempos de datos conscientes de la zona horaria:

USE_TZ = False

Las mejores prácticas de Django requieren el uso de UTC para almacenar información en la base de datos:

Incluso si su sitio web está disponible en una sola zona horaria, sigue siendo una buena práctica almacenar datos en UTC en su base de datos. La razón principal es el horario de verano (DST). Muchos países tienen un sistema de horario de verano, donde los relojes se mueven hacia adelante en primavera y hacia atrás en otoño. Si está trabajando en la hora local, es probable que encuentre errores dos veces al año, cuando ocurren las transiciones.

https://docs.djangoproject.com/en/stable/topics/i18n/timezones/

Accediendo a las configuraciones

Una vez que tenga todas sus configuraciones, querrá usarlas en su código. Para hacerlo, agregue la siguiente importación a su archivo:

from django.conf import settings

Luego puede acceder a su configuración como atributos del módulo de settings , por ejemplo:

if not settings.DEBUG:
    email_user(user, message)

Usando BASE_DIR para asegurar la portabilidad de la aplicación

Es una mala idea para las rutas de código duro en su aplicación. Siempre se deben usar direcciones URL relativas para que su código pueda funcionar sin problemas en diferentes máquinas. La mejor manera de configurar esto es definir una variable como esta

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

Luego use esta variable BASE_DIR para definir todas sus otras configuraciones.

TEMPLATE_PATH = os.path.join(BASE_DIR, "templates")
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),

]

Y así. Esto garantiza que pueda transferir su código a diferentes máquinas sin ninguna preocupación.

Sin embargo, os.path es un poco detallado. Por ejemplo, si su módulo de configuración es project.settings.dev , tendrá que escribir:

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

Una alternativa es utilizar el módulo unipath (que puede instalar con pip install unipath ).

from unipath import Path

BASE_DIR = Path(__file__).ancestor(2)  # or ancestor(3) if using a submodule

TEMPLATE_PATH = BASE_DIR.child('templates')
STATICFILES_DIRS = [
    BASE_DIR.child('static'),
]

Uso de variables de entorno para gestionar la configuración en servidores

El uso de variables de entorno es una forma muy utilizada para configurar la configuración de una aplicación en función de su entorno, como se indica en la aplicación The Twelve-Factor .

Como es probable que las configuraciones cambien entre los entornos de implementación, esta es una forma muy interesante de modificar la configuración sin tener que buscar en el código fuente de la aplicación, así como guardar secretos fuera de los archivos de la aplicación y el repositorio de código fuente.

En Django, la configuración principal se encuentra como settings.py en la carpeta de su proyecto. Como es un simple archivo de Python, puede usar el módulo os de Python de la biblioteca estándar para acceder al entorno (e incluso tener los valores predeterminados adecuados).

settings.py

import os

SECRET_KEY = os.environ.get('APP_SECRET_KEY', 'unsafe-secret-key')

DEBUG = bool(os.environ.get('DJANGO_DEBUG', True) == 'False')

ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS', '').split()

DATABASES = {
    'default': {
        'ENGINE': os.environ.get('APP_DB_ENGINE', 'django.db.backends.sqlite3'),
        'NAME': os.environ.get('DB_NAME', 'db.sqlite'),    
        'USER': os.environ.get('DB_USER', ''),
        'PASSWORD': os.environ.get('DB_PASSWORD', ''),
        'HOST': os.environ.get('DB_HOST', None),
        'PORT': os.environ.get('DB_PORT', None),
        'CONN_MAX_AGE': 600,
    }
}

Con Django, puede cambiar la tecnología de su base de datos, de modo que puede usar sqlite3 en su máquina de desarrollo (y eso debería ser un buen valor predeterminado para comprometerse con un sistema de control de origen). Aunque esto es posible no es aconsejable:

Los servicios de respaldo, como la base de datos de la aplicación, el sistema de colas o el caché, es un área donde la paridad dev / prod es importante. ( La aplicación de los doce factores - Paridad de desarrollo / prod )

Para utilizar un parámetro DATABASE_URL para la conexión a la base de datos, consulte el ejemplo relacionado .

Usando múltiples configuraciones

El diseño de proyecto predeterminado de Django crea un solo settings.py . Esto suele ser útil para dividirlo así:

myprojectroot/
    myproject/
        __init__.py
        settings/
            __init__.py
            base.py
            dev.py
            prod.py
            tests.py

Esto le permite trabajar con diferentes configuraciones según esté en desarrollo, producción, pruebas o lo que sea.

Al pasar del diseño predeterminado a este diseño, la settings.py original.py se convierte en settings/base.py Cuando todos los demás submódulos "subclase" settings/base.py comenzando con from .base import * . Por ejemplo, aquí es cómo se ve la settings/dev.py :

# -*- coding: utf-8 -*-
from .base import *  # noqa

DEBUG = True
INSTALLED_APPS.extend([
    'debug_toolbar',
])
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
INTERNAL_IPS = ['192.168.0.51', '192.168.0.69']

Alternativa # 1

Para que django-admin comandos de django-admin funcionen correctamente, tendrá que configurar la variable de entorno DJANGO_SETTINGS_MODULE (que por defecto es myproject.settings ). En desarrollo, lo establecerá en myproject.settings.dev . En producción, lo establecerá en myproject.settings.prod . Si usa un virtualenv, lo mejor es establecerlo en su script postactivate :

#!/bin/sh
export PYTHONPATH="/home/me/django_projects/myproject:$VIRTUAL_ENV/lib/python3.4"
export DJANGO_SETTINGS_MODULE="myproject.settings.dev"

Si desea usar un módulo de configuración que no es señalado por DJANGO_SETTINGS_MODULE por una vez, puede usar la opción --settings de django-admin :

django-admin test --settings=myproject.settings.tests

Alternativa # 2

Si quieres dejar DJANGO_SETTINGS_MODULE en su configuración por defecto ( myproject.settings ), puede simplemente decir la settings módulo de la configuración que se cargue mediante la colocación de la importación en su __init__.py archivo.

En el ejemplo anterior, el mismo resultado se podría lograr al tener un __init__.py configurado para:

from .dev import *

Usando múltiples archivos de requerimientos

Cada archivo de requisitos debe coincidir con el nombre de un archivo de configuración. Lea Uso de configuraciones múltiples para más información.

Estructura

djangoproject
├── config
│   ├── __init__.py
│   ├── requirements
│   │   ├── base.txt
│   │   ├── dev.txt
│   │   ├── test.txt
│   │   └── prod.txt
│   └── settings
└── manage.py

En el archivo base.txt , coloque las dependencias utilizadas en todos los entornos.

# base.txt
Django==1.8.0
psycopg2==2.6.1
jinja2==2.8

Y en todos los demás archivos, incluya las dependencias base con -r base.txt y agregue las dependencias específicas necesarias para el entorno actual.

# dev.txt
-r base.txt # includes all dependencies in `base.txt`

# specific dependencies only used in dev env
django-queryinspect==0.1.0
# test.txt
-r base.txt # includes all dependencies in `base.txt`

# specific dependencies only used in test env
nose==1.3.7
django-nose==1.4
# prod.txt
-r base.txt # includes all dependencies in `base.txt`

# specific dependencies only used in production env
django-queryinspect==0.1.0
gunicorn==19.3.0
django-storages-redux==1.3
boto==2.38.0

Finalmente, para instalar dependencias. Ejemplo, en dev env: pip install -r config/requirements/dev.txt

Ocultar datos secretos usando un archivo JSON

Al usar un VCS como Git o SVN, hay algunos datos secretos que nunca deben ser versionados (ya sea que el repositorio sea público o privado).

Entre esos datos, se encuentra la configuración SECRET_KEY y la contraseña de la base de datos.

Una práctica común para ocultar estas configuraciones del control de versiones es crear un archivo secrets.json en la raíz de su proyecto ( gracias a la idea ) " Two Scoops of Django " :

{
    "SECRET_KEY": "N4HE:AMk:.Ader5354DR453TH8SHTQr",
    "DB_PASSWORD": "v3ry53cr3t"
}

Y .gitignore a tu lista de ignorados ( .gitignore para git):

*.py[co]
*.sw[po]
*~
/secrets.json

Luego agregue la siguiente función a su módulo de settings :

import json
import os
from django.core.exceptions import ImproperlyConfigured

with open(os.path.join(BASE_DIR, 'secrets.json')) as secrets_file:
    secrets = json.load(secrets_file)

def get_secret(setting, secrets=secrets):
    """Get secret setting or fail with ImproperlyConfigured"""
    try:
        return secrets[setting]
    except KeyError:
        raise ImproperlyConfigured("Set the {} setting".format(setting))

Luego llene la configuración de esta manera:

SECRET_KEY = get_secret('SECRET_KEY')
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgres',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': get_secret('DB_PASSWORD'),
    },
}

Créditos: Two Scoops of Django: Best Practices for Django 1.8, de Daniel Roy Greenfeld y Audrey RoyGreenfeld. Copyright 2015 Two Scoops Press (ISBN 978-0981467344)

Usando un DATABASE_URL del entorno

En sitios de PaaS como Heroku, es habitual recibir la información de la base de datos como una única variable de entorno de URL, en lugar de varios parámetros (host, puerto, usuario, contraseña ...).

Hay un módulo, dj_database_url , que extrae automáticamente la variable de entorno DATABASE_URL a un diccionario de Python apropiado para inyectar la configuración de la base de datos en Django.

Uso:

import dj_database_url

if os.environ.get('DATABASE_URL'):
    DATABASES['default'] =
        dj_database_url.config(default=os.environ['DATABASE_URL'])


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow