libro python django django-settings

python - el libro de django 2.0 pdf



Configuración de django por aplicación-¿Mejor práctica? (2)

Esto está algo relacionado con esta pregunta.
¿Por qué la configuración de django es un objeto LazyObject?

En mi proyecto django tengo varias aplicaciones. Cada aplicación puede tener su propio archivo de configuración no trivial.

proj/ proj/ settings.py app/ settings.py views.py

¿Cuál es la mejor práctica general aquí?
debe app / settings.py hacer

from django.conf import settings APP_SETTING= lambda: settings.getattr(''APP_SETTING'', ''custom_value'') PROJ_SETTING= lambda: settings.PROJ_SETTING

y luego en app / views.py do

import .settings X = settings.APP_SETTING Y = settings.PROJ_SETTING

¿O debería modificar el objeto de configuración perezosa de django en app / settings.py según el estilo de codificación de django?

from django.conf import settings # not even sure how I would check for a default value that was specified in proj/settings.py settings.configure(APP_SETTING=''custom_value'')

y luego, cada aplicación / views.py solo consume proj / settings.py a través de la configuración de django.conf?

from django.conf import settings X = settings.APP_SETTING Y = settings.PROJ_SETTING

Obviamente hay muchas otras permutaciones, pero creo que mi intención es clara.
Gracias por adelantado.


La solución más sencilla es usar el getattr(settings, ''MY_SETTING'', ''my_default'') que mencionas. Sin embargo, puede ser un poco tedioso tener que hacer esto en múltiples lugares.

Recomendación adicional: use un prefijo por aplicación como MYAPP_MY_SETTING .

Sin embargo, hay una aplicación django que se deshace de getattr y maneja el prefijo por ti. Ver http://django-appconf.readthedocs.org/en/latest/

Normalmente creas un conf.py por aplicación con contenidos como este:

from django.conf import settings from appconf import AppConf class MyAppConf(AppConf): SETTING_1 = "one" SETTING_2 = ( "two", )

Y en tu código:

from myapp.conf import settings def my_view(request): return settings.MYAPP_SETTINGS_1 # Note the handy prefix

En caso de que necesite personalizar la configuración en su sitio, todo lo que necesita hacer es una entrada regular en la settings.py su sitio:

MYAPP_SETTINGS_1 = "four, four I say"


No estoy seguro sobre las mejores prácticas, pero no tengo ningún problema con el siguiente estilo:

proj / settings.py

OPTION_A = ''value'' # or with namespace APP_NAMESPACE = ''APP'' APP_OPTION_B = 4

app / settings.py

from django.conf import settings from django.utils.functional import SimpleLazyObject OPTION_A = getattr(settings, ''OPTION_A'', ''default_value'') # or with namespace NAMESPACE = getattr(settings, APP_NAMESPACE, ''APP'') OPTION_B = getattr(settings, ''_''.join([NAMESPACE, ''OPTION_B'']), ''default_value'') OPTION_C = getattr(settings, ''_''.join([NAMESPACE, ''OPTION_C'']), None) if OPTION_C is None: raise ImproperlyConfigured(''...'') # lazy option with long initialization OPTION_D = SimpleLazyObject(lambda: open(''file.txt'').read())

app / views.py

from .settings import OPTION_A, OPTION_B # or from . import settings as app_settings app_settings.OPTION_C app_settings.OPTION_D # initialized on access