2012-06-28 7 views

risposta

7

Verificare this section dello stile di codifica Django. Il motivo è spiegato qui (citato sotto).

Oltre alle prestazioni, i moduli di terze parti possono modificare le impostazioni al momento dell'importazione. L'accesso alle impostazioni dovrebbe essere ritardato per garantire che questa configurazione avvenga prima.

moduli non devono in ambienti di uso generale memorizzato in django.conf.settings al livello superiore (cioè valutate quando il modulo viene importato ). La spiegazione di ciò è la seguente:

configurazione manuale delle impostazioni (cioè non basandosi sulla variabile di ambiente DJANGO_SETTINGS_MODULE) è consentito e possibile come segue:

from django.conf import settings 

settings.configure ({}, SOME_SETTING = 'pippo') Tuttavia, se qualsiasi impostazione è accessibile prima della riga settings.configure, questo non funzionerà. (Internamente, le impostazioni sono LazyObject che si configura automaticamente quando si accede alle impostazioni se non è già stato configurato ).

Quindi, se v'è un modulo che contiene un po 'di codice come segue:

from django.conf import settings 
from django.core.urlresolvers import get_callable 

default_foo_view = get_callable(settings.FOO_EXAMPLE_VIEW) 

... quindi importando questo modulo farà sì che le impostazioni oggetto da configurare. Che significa che la possibilità per le terze parti di importare il modulo al livello superiore non è compatibile con la possibilità di configurare manualmente le impostazioni dell'oggetto o in alcune circostanze è molto difficile.

Invece del codice precedente, un livello di pigrizia o indiretto deve essere usato, come django.utils.functional.LazyObject, django.utils.functional.lazy() o lambda.

3

È un oggetto proxy che astrae i file delle impostazioni effettive e lo rende leggero finché non si accede effettivamente alle impostazioni desiderate. Dopo aver iniziato ad accedere agli attributi, verrà caricato su richiesta. L'idea è di ridurre le spese generali nelle impostazioni di caricamento finché non ne hai bisogno.

+3

Lo scopo è davvero quello di ridurre i costi generali? Voglio dire, ovviamente dovrai caricare il file delle impostazioni * alla fine *, non riesco a immaginare alcun progetto di django che non lo farebbe, quindi sembra inutile ritardare il caricamento, come farebbe all'inizio. –

0

Penso che lo scopo sia quello di semplificare le impostazioni dal punto di vista degli sviluppatori. Quindi ogni progetto può avere il proprio file settings.py senza dover definire tutte le altre impostazioni di Django. Il tipo di wrapper LazySettings combina tutto da Django global_settings.py e le impostazioni locali. Permette allo sviluppatore di decidere quali impostazioni vuole sovrascrivere, quali vogliono mantenere le impostazioni predefinite o quali desidera aggiungere.

La classe LazySettings è forse un nome sbagliato per questo, perché penso che non sia veramente pigro. Una volta che fai qualcosa come from django.conf import settings l'intero oggetto delle impostazioni è nel tuo scope.

Problemi correlati