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_MODULE
variable 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_MODULE
para 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.py
ymyapp/test_settings.py
en su repositorio de origen.En ese caso, debería configurar respectivamente el
DJANGO_SETTINGS_MODULE=myapp.production_settings
uso del primero yDJANGO_SETTINGS_MODULE=myapp.test_settings
el segundo.De aquí en adelante, el problema se reduce a configurar la
DJANGO_SETTINGS_MODULE
variable de entorno.Configuración
DJANGO_SETTINGS_MODULE
mediante 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
.bashrc
ni en nada.Configuración
DJANGO_SETTINGS_MODULE
mediante 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:
environment
clave de configuración de un programa ..env
archivo "environment" ( ) .Finalmente, tenga en cuenta que puede aprovechar la
PYTHONPATH
variable 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.py
archivo se almacenaSiteName/settings.py
de 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_MODULE
para elegir el que desea usar. Modificarbin/activate
es 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.py
en la misma carpeta que susettings.py
archivo. Agregue anulaciones allí, comoDEBUG=True
.En la computadora que se usará para el desarrollo, agregue esto a su
~/.bashrc
archivo:En la parte inferior de su
settings.py
archivo, 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
PYTHONPATH
o configuraciónDJANGO_SETTINGS_MODULE
que 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 true
método anterior no se pudo importar en Python 3.6.DEV
configuración que filtrará datos privados en un servidor público. Realmente solo desea verificar que laDJANGO_DEVELOPMENT
variable de entorno existe (es deciris not None
).settings_dev.py
estaba cargando en el servidor.is not None
cheque. Tambiénos.getenv
está 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_APPS
variable 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
settings
directorio__init__.py
, a saberbase.py
,dev.py
yprod.py
Archivos de configuración:
Ábrelo
__init__.py
y rellénalo con el siguiente contenido:init .py:
Ábralo
base.py
y rellénelo con todas las configuraciones comunes (que se usarán tanto en producción como en desarrollo), por ejemplo:base.py:
Abra
dev.py
e incluya las cosas que son específicas del desarrollo, por ejemplo:dev.py:
Abra
prod.py
e incluya las cosas que son específicas de la producción, por ejemplo:prod.py:
fuente
Cree varios
settings*.py
archivos, extrapolando las variables que deben cambiar por entorno. Luego, al final de susettings.py
archivo maestro :Mantienes los
settings_*
archivos separados para cada etapa.En la parte superior de su
settings_dev.py
archivo, 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.py
modname = "%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:
settings
módulo para dividir la configuración en varios archivos para facilitar la lectura;.env.json
archivo para almacenar credenciales y parámetros que queremos excluir de nuestro repositorio de git, o que son específicos del entorno;env.py
archivo para leer el.env.json
archivoConsiderando la siguiente estructura:
Con
.env.json
como:Y
project_name/env.py
:Podemos tener las siguientes configuraciones:
los beneficios de esta solución son:
.env.json
como desarrollo, puesta en marcha y producción;Espero que esto ayude, solo avíseme si ve alguna advertencia con esta solución.
fuente
env
se debe reemplazardev
,prod
etc.? ¿Qué va en elsettings.py
archivo antiguo ? ¿Qué haystorage.py
ydatabase.py
?env.py
archivo para que pueda elegir, con una variable de entorno, qué archivo cargarYo uso la siguiente estructura de archivos:
Por
__init__.py
lo tanto, hay un enlace (en unix o mklink en Windows) aolocal.py
puede ser paraprod.py
que la configuración aún en elproject.settings
módulo esté limpia y organizada, y si desea usar una configuración en particular, puede usar la variable de entornoDJANGO_SETTINGS_MODULE
paraproject.settings.prod
si lo necesita para ejecutar un comando para el entorno de producción.En los archivos
prod.py
ylocal.py
:y el
shared.py
archivo 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
Config
clase dentro delenv.py
archivo. Entonces, en lugar de unimport *
, el módulo puede ser importado porfrom env import Config
. De esta manera, tampoco es necesario usar ese ifos.path
check, lo que hace que todo esto sea mucho más simple.Utilizar
settings.py
para producción. En el mismo directorio, creesettings_dev.py
para 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.py
y 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.py
ysettings_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_dir
reemplazarásettings.py in Project
.¿Cómo elegir diferentes env?
__init__.py
directamente.__init__.py
.__init__.py
leer 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