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