He estado desarrollando una aplicación básica. Ahora, en la etapa de implementación, ha quedado claro que necesito tanto una configuración local como una configuración de producción.
Sería genial saber lo siguiente:
- La mejor manera de lidiar con los entornos de desarrollo y producción.
- Cómo mantener aplicaciones como django-debug-toolbar solo en un entorno de desarrollo.
- Otros consejos y prácticas recomendadas para la configuración de desarrollo e implementación.

Respuestas:
La
DJANGO_SETTINGS_MODULEvariable de entorno controla qué archivo de configuración cargará Django.Por lo tanto, crea archivos de configuración separados para sus respectivos entornos (tenga en cuenta que, por supuesto, pueden hacerlo
import *desde un archivo de "configuración compartida" separado) y utilizarlosDJANGO_SETTINGS_MODULEpara controlar cuál usar.Así es cómo:
Como se indica en la documentación de Django:
Entonces, supongamos que lo creó
myapp/production_settings.pyymyapp/test_settings.pyen su repositorio de origen.En ese caso, debería configurar respectivamente el
DJANGO_SETTINGS_MODULE=myapp.production_settingsuso del primero yDJANGO_SETTINGS_MODULE=myapp.test_settingsel segundo.De aquí en adelante, el problema se reduce a configurar la
DJANGO_SETTINGS_MODULEvariable de entorno.Configuración
DJANGO_SETTINGS_MODULEmediante un script o un shellA continuación, puede utilizar un script de arranque o un gestor de procesos para cargar los ajustes correctos (ajustando el medio ambiente), o simplemente ejecutarlo desde su shell antes de comenzar Django:
export DJANGO_SETTINGS_MODULE=myapp.production_settings.Tenga en cuenta que puede ejecutar esta exportación en cualquier momento desde un shell; no es necesario que viva en su
.bashrcni en nada.Configuración
DJANGO_SETTINGS_MODULEmediante un administrador de procesosSi no le gusta escribir un script de arranque que establezca el entorno (¡y hay muy buenas razones para sentirse así!), Le recomendaría usar un administrador de procesos:
environmentclave de configuración de un programa ..envarchivo "environment" ( ) .Finalmente, tenga en cuenta que puede aprovechar la
PYTHONPATHvariable para almacenar la configuración en una ubicación completamente diferente (por ejemplo, en un servidor de producción, almacenándola/etc/). Esto permite separar la configuración de los archivos de la aplicación. Puede que quieras o no eso, depende de cómo esté estructurada tu aplicación.fuente
settings.pyarchivo se almacenaSiteName/settings.pyde forma predeterminada, si coloca sus archivos de configuración alternativos en el mismo directorio, la línea agregada a bin / enable debería leerDJANGO_SETTINGS_MODULE="SiteName.test_settings"De lo contrario, ¡excelente respuesta!DJANGO_SETTINGS_MODULEpara elegir el que desea usar. Modificarbin/activatees uno para hacer lo último (TBH, ya no creo que esto sea una buena idea de todos modos, así que lo eliminé), pero no es el único.De forma predeterminada, utilice la configuración de producción, pero cree un archivo llamado
settings_dev.pyen la misma carpeta que susettings.pyarchivo. Agregue anulaciones allí, comoDEBUG=True.En la computadora que se usará para el desarrollo, agregue esto a su
~/.bashrcarchivo:En la parte inferior de su
settings.pyarchivo, agregue lo siguiente.(Tenga en cuenta que la importación
*generalmente debe evitarse en Python)De forma predeterminada, los servidores de producción no anularán nada. ¡Hecho!
En comparación con las otras respuestas, esta es más simple porque no requiere actualización
PYTHONPATHo configuraciónDJANGO_SETTINGS_MODULEque solo le permite trabajar en un proyecto de django a la vez.fuente
if os.environ.get('DJANGO_DEVELOPMENT', 'true')también funciona. Menciono esto solo porque elis not truemétodo anterior no se pudo importar en Python 3.6.DEVconfiguración que filtrará datos privados en un servidor público. Realmente solo desea verificar que laDJANGO_DEVELOPMENTvariable de entorno existe (es deciris not None).settings_dev.pyestaba cargando en el servidor.is not Nonecheque. Tambiénos.getenvestá la taquigrafíaNormalmente tengo un archivo de configuración por entorno y un archivo de configuración compartido:
Cada uno de mis archivos de entorno tiene:
Esto me permite anular la configuración compartida si es necesario (agregando las modificaciones debajo de esa estrofa).
Luego selecciono qué archivos de configuración usar vinculándolos a settings.py:
fuente
import *? ¿Desactiva ese cheque? Envolví esta importación en unexec()pero luego no puedo tener condicionales en variables que no están definidas en este archivo, ni puedo alterar laINSTALLED_APPSvariable porque está "indefinida"Así es como lo hago en 6 sencillos pasos:
Cree una carpeta dentro del directorio de su proyecto y asígnele un nombre
settings.Estructura del proyecto:
Cree cuatro archivos de Python dentro del
settingsdirectorio__init__.py, a saberbase.py,dev.pyyprod.pyArchivos de configuración:
Ábrelo
__init__.pyy rellénalo con el siguiente contenido:init .py:
Ábralo
base.pyy rellénelo con todas las configuraciones comunes (que se usarán tanto en producción como en desarrollo), por ejemplo:base.py:
Abra
dev.pye incluya las cosas que son específicas del desarrollo, por ejemplo:dev.py:
Abra
prod.pye incluya las cosas que son específicas de la producción, por ejemplo:prod.py:
fuente
Cree varios
settings*.pyarchivos, extrapolando las variables que deben cambiar por entorno. Luego, al final de susettings.pyarchivo maestro :Mantienes los
settings_*archivos separados para cada etapa.En la parte superior de su
settings_dev.pyarchivo, agregue esto:Para importar variables que necesita modificar.
Esta entrada de wiki tiene más ideas sobre cómo dividir su configuración.
fuente
settings_prod.pymodname = "%s.settings" % ".".join(__name__.split('.')[:-1])para obtener el nombre completo del módulo y luegoglobals().update(vars(sys.modules[modname])). Encuentro que funciona muy bien para mí. Por supuesto, renunciar al bit sobre la determinación programática del nombre del módulo en favor de una cadena probablemente también funcionaría en la mayoría de los casos.Utilizo las increíbles configuraciones de django , y todas las configuraciones se almacenan en mi
settings.py:Para configurar el proyecto Django, solo seguí los documentos .
fuente
Este es el enfoque que usamos:
settingsmódulo para dividir la configuración en varios archivos para facilitar la lectura;.env.jsonarchivo para almacenar credenciales y parámetros que queremos excluir de nuestro repositorio de git, o que son específicos del entorno;env.pyarchivo para leer el.env.jsonarchivoConsiderando la siguiente estructura:
Con
.env.jsoncomo:Y
project_name/env.py:Podemos tener las siguientes configuraciones:
los beneficios de esta solución son:
.env.jsoncomo desarrollo, puesta en marcha y producción;Espero que esto ayude, solo avíseme si ve alguna advertencia con esta solución.
fuente
envse debe reemplazardev,prodetc.? ¿Qué va en elsettings.pyarchivo antiguo ? ¿Qué haystorage.pyydatabase.py?env.pyarchivo para que pueda elegir, con una variable de entorno, qué archivo cargarYo uso la siguiente estructura de archivos:
Por
__init__.pylo tanto, hay un enlace (en unix o mklink en Windows) aolocal.pypuede ser paraprod.pyque la configuración aún en elproject.settingsmódulo esté limpia y organizada, y si desea usar una configuración en particular, puede usar la variable de entornoDJANGO_SETTINGS_MODULEparaproject.settings.prodsi lo necesita para ejecutar un comando para el entorno de producción.En los archivos
prod.pyylocal.py:y el
shared.pyarchivo se mantiene global sin configuraciones específicas.fuente
basándose en la respuesta de cs01:
si tiene problemas con la variable de entorno, establezca su valor en una cadena (por ejemplo, lo hice
DJANGO_DEVELOPMENT="true").También cambié el flujo de trabajo del archivo cs01 de la siguiente manera:
De esta manera, Django no tiene que leer la totalidad de un archivo de configuración antes de ejecutar el archivo de configuración apropiado. Esta solución es útil si su archivo de producción necesita cosas que solo están en su servidor de producción.
Nota: en Python 3, los archivos importados deben tener un
.anexo (pfrom .settings_dev import *. Ej. )fuente
Si desea mantener 1 archivo de configuración y su sistema operativo de desarrollo es diferente a su sistema operativo de producción, puede ponerlo en la parte inferior de su settings.py:
Leer más: ¿Cómo verifico el sistema operativo en Python?
fuente
Esto parece haber sido respondido, sin embargo, un método que utilizo combinado con el control de versiones es el siguiente:
Configure un archivo env.py en el mismo directorio que la configuración en mi entorno de desarrollo local que también agrego a .gitignore:
env.py:
.gitignore:
settings.py:
Me parece que esto funciona y es mucho más elegante: con env.py es fácil ver nuestras variables de entorno local y podemos manejar todo esto sin múltiples archivos settings.py o similares. Este método permite utilizar todo tipo de variables de entorno local que no quisiéramos configurar en nuestro servidor de producción. Utilizando .gitignore a través del control de versiones, también mantenemos todo perfectamente integrado.
fuente
Configclase dentro delenv.pyarchivo. Entonces, en lugar de unimport *, el módulo puede ser importado porfrom env import Config. De esta manera, tampoco es necesario usar ese ifos.pathcheck, lo que hace que todo esto sea mucho más simple.Utilizar
settings.pypara producción. En el mismo directorio, creesettings_dev.pypara anulaciones.En una máquina de desarrollo, ejecute su aplicación Django con:
En una máquina de producción, ejecute como si lo acabara de tener
settings.pyy nada más.VENTAJAS
settings.py(utilizado para la producción) es completamente independiente del hecho de que exista cualquier otro entorno.settings_dev.py. No hay necesidad de recopilar configuraciones dispersa a través desettings_prod.py,settings_dev.pyysettings_shared.py.fuente
Para el problema de configurar archivos, elijo copiar
Cuando ejecute django, se ejecutará __init__py. En este momento,
settings.py in setting1_dirreemplazarásettings.py in Project.¿Cómo elegir diferentes env?
__init__.pydirectamente.__init__.py.__init__.pyleer esta variable.¿Por qué utilizar de esta manera?
Debido a que no me gustan tantos archivos en el mismo directorio, demasiados archivos confundirán a otros socios y no muy bien para el IDE (el IDE no puede encontrar el archivo que usamos).
Si no desea ver todos estos detalles, puede dividir el proyecto en dos partes.
fuente
Estoy usando un archivo app.yaml diferente para cambiar la configuración entre entornos en el motor de aplicaciones en la nube de Google.
Puede usar esto para crear una conexión proxy en su comando de terminal:
https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy#macos-64-bit
Archivo: app.yaml
fuente
Esta es mi solución, con diferentes entornos para desarrollo, prueba y producción.
fuente