2012-06-28 13 views

Respuesta

7

Consulte this section del estilo de codificación Django. La razón se explica allí (se cita a continuación).

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.

3

Es un objeto proxy que abstrae los archivos de configuración reales y hace que sea liviano hasta que realmente acceda a la configuración que desea. Una vez que comience a acceder a los atributos, se cargará a demanda. La idea es reducir los gastos generales en la configuración de carga hasta que los necesite.

+3

¿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. –

0

Creo que el objetivo es simplificar la configuración desde el punto de vista de los desarrolladores. De modo que cada proyecto puede tener su propio archivo settings.py sin tener que definir todas las demás configuraciones de Django. El contenedor LazySettings combina todo desde Django global_settings.py y su configuración local. Le permite al desarrollador decidir qué configuraciones quiere sobreescribir, y quiere mantener las predeterminadas o las que quiere agregar.

La clase LazySettings es quizás un nombre equivocado para esto, porque creo que no es realmente vago. Una vez que haga algo como from django.conf import settings, todo el objeto de configuración está en su alcance.

Cuestiones relacionadas