2012-06-28 7 views

Antwort

7

Überprüfen Sie this section des Django-Codierungsstils. Der Grund wird dort erklärt (unten zitiert).

Zusätzlich zur Leistung können Module von Drittanbietern Einstellungen ändern, wenn sie importiert werden. Der Zugriff auf Einstellungen sollte verzögert werden, um sicherzustellen, dass diese Konfiguration zuerst erfolgt.

Module sollten in django.conf.settings auf der obersten Ebene nicht in den allgemeinen Gebrauch Einstellungen gespeichert (d ausgewertet, wenn das Modul importiert wird). Die Erklärung hierfür ist wie folgt:

manuelle Konfiguration von Einstellungen (also nicht auf dem DJANGO_SETTINGS_MODULE Umgebungsvariable unter Berufung) ist zulässig und möglich wie folgt:

from django.conf import settings 

settings.configure ({}, SOME_SETTING = 'foo') Wenn jedoch eine Einstellung vor der Zeile settings.configure aufgerufen wird, wird dies nicht funktionieren. (Intern, Einstellungen ist ein LazyObject, das sich automatisch konfiguriert wenn die Einstellungen zugegriffen werden, wenn es nicht bereits konfiguriert wurde).

Also, wenn es ein Modul einen Code enthält, wie folgt:

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

default_foo_view = get_callable(settings.FOO_EXAMPLE_VIEW) 

... dann dieses Modul einge bewirkt, dass die Einstellungen konfiguriert werden, widersprechen. Das bedeutet, dass die Fähigkeit für Dritte, das Modul unter der obersten Ebene zu importieren, nicht mit der Möglichkeit kompatibel ist, das Objekt manuell zu konfigurieren, oder es unter bestimmten Umständen sehr schwierig macht.

Anstelle des obigen Code, ein Niveau von Faulheit oder Indirekt müssen verwendet werden, wie django.utils.functional.LazyObject, django.utils.functional.lazy() oder lambda.

3

Es ist ein Proxy-Objekt, das die eigentlichen Einstellungsdateien abstrahiert und es leicht macht, bis Sie tatsächlich auf die gewünschten Einstellungen zugreifen. Sobald Sie mit dem Zugriff auf die Attribute beginnen, wird sie bei Bedarf geladen. Die Idee ist, den Aufwand in Ladeeinstellungen zu reduzieren, bis Sie sie benötigen.

+3

Ist der Zweck wirklich, Overhead zu reduzieren? Ich meine, du musst die Einstellungsdatei * endlich * laden, ich kann mir kein Django-Projekt vorstellen, das nicht funktionieren würde, daher erscheint es sinnlos, das Laden zu verzögern, das könntest du auch am Anfang machen. –

0

Ich denke, dass der Zweck ist, Einstellungen aus Sicht der Entwickler zu vereinfachen. Jedes Projekt kann also seine eigene settings.py-Datei haben, ohne dass auch alle anderen Django-Einstellungen definiert werden müssen. Die Wrapper-Art LazySettings kombiniert alles aus Django global_settings.py und Ihren lokalen Einstellungen. Der Entwickler kann entscheiden, welche Einstellungen er überschreiben möchte, welche er beibehalten oder welche er hinzufügen möchte.

Die LazySettings Klasse ist vielleicht ein falscher Name dafür, weil ich denke, dass es nicht wirklich faul ist. Sobald Sie etwas wie from django.conf import settings tun, ist das gesamte Einstellungsobjekt in Ihrem Bereich.

Verwandte Themen