Además del rendimiento, los módulos de terceros pueden modificar la configuración cuando se importan. El acceso a la configuración debe retrasarse para garantizar que esta configuración se realice primero.
módulos no deberían en la configuración de uso general se almacena en django.conf.settings en el nivel superior (es decir evaluaron cuando el módulo se importa). La explicación de esto es como sigue:
se permite
configuración manual de los ajustes (es decir, no depender de la variable de entorno DJANGO_SETTINGS_MODULE) y posible como sigue:
from django.conf import settings
settings.configure ({}, SOME_SETTING = 'foo') Sin embargo, si alguna configuración es accedida antes de la línea configuración.configuración, esto no funcionará. (Internamente, la configuración es un LazyObject que se configura a sí mismo automáticamente cuando se accede a la configuración si ya no se ha configurado ).
lo tanto, si hay un módulo que contiene un código de la siguiente manera:
from django.conf import settings
from django.core.urlresolvers import get_callable
default_foo_view = get_callable(settings.FOO_EXAMPLE_VIEW)
... luego importando este módulo hará que la configuración del objeto para ser configurado. Que significa que la capacidad de terceros para importar el módulo en el nivel superior es incompatible con la capacidad de configurar el objeto configuración manualmente, o lo hace muy difícil en algunas circunstancias.
En lugar del código anterior, un nivel de indirección pereza o debe utilizados, como django.utils.functional.LazyObject
, django.utils.functional.lazy()
o lambda
.
¿El propósito es realmente reducir la sobrecarga? Quiero decir, obviamente necesitarás cargar el archivo de configuración * eventualmente *, no puedo imaginarme ningún proyecto de django que no lo haga, por lo que parece inútil demorar la carga, igual podrías hacerlo al principio. –