Tiendo a usar SQLite cuando desarrollo Django , pero en un servidor en vivo a menudo se necesita algo más robusto ( MySQL / PostgreSQL , por ejemplo). Invariablemente, también hay otros cambios que realizar en la configuración de Django: diferentes ubicaciones / intensidades de registro, rutas de medios, etc.
¿Cómo gestiona todos estos cambios para que la implementación sea un proceso simple y automatizado?
Respuestas:
Actualización: se ha lanzado django-configurations, que probablemente sea una mejor opción para la mayoría de las personas que hacerlo manualmente.
Si prefiere hacer las cosas manualmente, mi respuesta anterior aún se aplica:
Tengo varios archivos de configuración.
settings_local.py
- configuración específica del host, como nombre de la base de datos, rutas de archivo, etc.settings_development.py
- configuración utilizada para el desarrollo, por ejemploDEBUG = True
.settings_production.py
- configuración utilizada para la producción, pSERVER_EMAIL
. ej .Ato todo esto junto con un
settings.py
archivo que primero importasettings_local.py
, y luego uno de los otros dos. Decide cuál cargar mediante dos configuraciones internassettings_local.py
:DEVELOPMENT_HOSTS
yPRODUCTION_HOSTS
.settings.py
llamadasplatform.node()
para encontrar el nombre de host de la máquina en la que se está ejecutando, y luego busca ese nombre de host en las listas y carga el segundo archivo de configuración según la lista en la que encuentre el nombre de host.De esa manera, lo único de lo que realmente debe preocuparse es mantener el
settings_local.py
archivo actualizado con la configuración específica del host, y todo lo demás se maneja automáticamente.Mira un ejemplo aquí .
fuente
_local
bastante confuso) y el hecho de que no está utilizando módulos (settings /base.py, settings / local.py, settings / production.py). También sería prudente mantener esto en un repositorio separado ... mejor aún, un servicio seguro que proporcione esta información desde una fuente canónica (probablemente exagerada para la mayoría) ... para que el nuevo host no requiera una nueva versión..py
archivo y, por lo tanto, dar acceso a cada host a la información sobre la configuración de todos los demás hosts, puede crear una plantilla del manage.py para usar la configuración adecuada. archivo en sus configuraciones de implementación.Personalmente, uso un archivo settings.py único para el proyecto, solo lo hago buscar el nombre de host en el que se encuentra (mis máquinas de desarrollo tienen nombres de host que comienzan con "gabriel", así que solo tengo esto:
luego en otras partes tengo cosas como:
y así. Un poco menos legible, pero funciona bien y evita tener que hacer malabares con varios archivos de configuración.
fuente
Al final de settings.py tengo lo siguiente:
De esta manera, si quiero anular la configuración predeterminada, solo necesito poner settings_local.py justo al lado de settings.py.
fuente
settings_local
da como resultado unImportError
, esteexcept
se lo tragará en silencio.No module named...
vscannot import name...
, pero es frágil. O coloque sus importaciones en settings_local.py en bloques de prueba y genere una excepción más específica:MisconfiguredSettings
o algo por el estilo.Tengo dos archivos.
settings_base.py
que contiene configuraciones comunes / predeterminadas, y que se registra en el control de fuente. Cada implementación tiene una implementación separadasettings.py
, que se ejecutafrom settings_base import *
al principio y luego se anula según sea necesario.fuente
settings_local.py
hace estofrom settings import *
, puede anular los valores ensettings.py
. (elsettings_local.py
archivo debe importarse al final desettings.py
).La forma más simplista que encontré fue:
1) use el settings.py predeterminado para el desarrollo local y 2) cree un production-settings.py comenzando con:
Y luego simplemente anule las configuraciones que difieren en la producción:
fuente
Algo relacionado, para el problema de la implementación de Django con múltiples bases de datos, es posible que desee echar un vistazo a Djangostack . Puedes descargar un instalador completamente gratuito que te permite instalar Apache, Python, Django, etc. Como parte del proceso de instalación te permitimos seleccionar qué base de datos quieres usar (MySQL, SQLite, PostgreSQL). Usamos los instaladores ampliamente cuando automatizamos implementaciones internamente (se pueden ejecutar en modo desatendido).
fuente
Tengo mi archivo settings.py en un directorio externo. De esa manera, no se registra en el control de código fuente ni se sobrescribe con una implementación. Puse esto en el archivo settings.py en mi proyecto Django, junto con cualquier configuración predeterminada:
Nota: Esto es muy peligroso si no puede confiar en local_settings.py.
fuente
Además de los múltiples archivos de configuración mencionados por Jim, también tiendo a colocar dos configuraciones en mi archivo settings.py en la parte superior
BASE_DIR
yBASE_URL
establecer la ruta del código y la URL a la base del sitio, todas las demás configuraciones se modifican para anexarse a estos.BASE_DIR = "/home/sean/myapp/"
p.ejMEDIA_ROOT = "%smedia/" % BASEDIR
Entonces, cuando muevo el proyecto, solo tengo que editar esta configuración y no buscar en todo el archivo.
También recomendaría mirar fabric y Capistrano (herramienta Ruby, pero se puede usar para implementar aplicaciones Django) que facilitan la automatización de la implementación remota.
fuente
Bueno, uso esta configuración:
Al final de settings.py:
Y en locale_settings.py:
fuente
¡Tantas respuestas complicadas!
Cada archivo settings.py viene con:
Utilizo ese directorio para configurar la variable DEBUG de esta manera (reemplace con el directorio donde está su código de desarrollo):
Luego, cada vez que se mueva el archivo settings.py, DEBUG será False y será su entorno de producción.
Cada vez que necesite configuraciones diferentes a las de su entorno de desarrollo, simplemente use:
fuente
Creo que depende del tamaño del sitio si necesita dejar de usar SQLite, he usado SQLite con éxito en varios sitios en vivo más pequeños y funciona muy bien.
fuente
Yo uso medio ambiente:
Creo que este es un enfoque mucho mejor, porque eventualmente necesitará configuraciones especiales para su entorno de prueba y puede agregarlo fácilmente a esta condición.
fuente
Esta es una publicación más antigua, pero creo que si agrego esta útil
library
, simplificará las cosas.Usa la configuración de django
Inicio rápido
Luego, realice una subclase de las configuraciones incluidas. Clase de configuración en el archivo settings.py de su proyecto o cualquier otro módulo que esté utilizando para almacenar las constantes de configuración, por ejemplo:
Establezca la
DJANGO_CONFIGURATION
variable de entorno con el nombre de la clase que acaba de crear, por ejemplo, en~/.bashrc
:export DJANGO_CONFIGURATION=Dev
y la
DJANGO_SETTINGS_MODULE
variable de entorno a la ruta de importación del módulo como de costumbre, por ejemplo, en bash:export DJANGO_SETTINGS_MODULE=mysite.settings
Alternativamente, proporcione la
--configuration
opción cuando use comandos de administración de Django siguiendo las líneas de la--settings
opción de línea de comandos predeterminada de Django , por ejemplo:python manage.py runserver --settings=mysite.settings --configuration=Dev
Para permitir que Django use su configuración, ahora tiene que modificar su script manage.py o wsgi.py para usar las versiones de django-configurations de las funciones de inicio apropiadas, por ejemplo, un manage.py típico usando django-configurations se vería así:
Observe que en la línea 10 no usamos la herramienta común,
django.core.management.execute_from_command_line
sino queconfigurations.management.execute_from_command_line
.Lo mismo se aplica a su archivo wsgi.py , por ejemplo:
Aquí no usamos la
django.core.wsgi.get_wsgi_application
función predeterminada , sinoconfigurations.wsgi.get_wsgi_application
.¡Eso es! Ahora puede usar su proyecto con manage.py y su servidor habilitado para WSGI favorito.
fuente
De hecho, probablemente debería considerar tener las mismas (o casi las mismas) configuraciones para su entorno de desarrollo y producción. De lo contrario, situaciones como "Oye, funciona en mi máquina" ocurrirán de vez en cuando.
Entonces, para automatizar su implementación y eliminar esos problemas de WOMM, simplemente use Docker .
fuente