2012-07-23 12 views
7

Die django docs eindeutigWarum sollten die Django-Einstellungen nicht zur Laufzeit geändert werden?

Sie sollten keine Einstellungen in Ihren Anwendungen zur Laufzeit ändern.

Hier ist die link to that statement

Meine Frage ist, warum das so ist? Ich möchte Anwendungen dynamisch zur Laufzeit hinzufügen und Datenbanken zur Laufzeit hinzufügen, die beide die Bearbeitung der Einstellungen beinhalten. Kann jemand erklären, warum Einstellungen zur Laufzeit nicht bearbeitet werden sollen und ob Ausnahmen existieren, welche Einstellungen sie sind und warum sie außergewöhnlich sind? Ich bin nicht so sehr daran interessiert, wie ich mein Ziel erreichen kann, sondern daran, warum Einstellungen nicht verändert werden sollten.

+0

Ich hatte einen Blick auf https://docs.djangoproject.com/en/dev/ref/settings/, und es scheint mir, das sind alle Einstellungen, die auf * Anwendung starten. * Folglich würde es nicht Es macht viel Sinn, sie zur Laufzeit zu ändern. –

Antwort

5

Die meisten Einstellungen werden nicht erneut gelesen, wenn Sie sie zur Laufzeit ändern. So wird Django die Änderungen, die Sie vornehmen, nicht erkennen.

Dies ist aufgrund der Tatsache, dass Django nur normale Python-Code ist. Es ist nicht wie ein Server, der Ihren Code überwacht - es ist nur ein Teil Ihres Codes.

In einigen Fällen reagieren Teile des Django-Codes möglicherweise auf Änderungen der Einstellungen, da sie beispielsweise bei jedem Senden von E-Mails 'settings.DEFAULT_FROM_EMAIL' ausführen.

Aber wenn Django die Einstellung in irgendeiner Weise verarbeitet, wie es für INSTALLED_APPS erforderlich ist, wird es nicht bemerken, dass Sie etwas geändert haben und die Verarbeitung wiederholen.

Welche Einstellungen sind sicher? Nun, die Ärzte sagen "keiner ist sicher", weil sich das in Zukunft ändern könnte. Django könnte aus irgendeinem Grund eine Kopie einer Einstellung speichern oder eine Bearbeitung vornehmen.

Das Ändern von INSTALLED_APPS konnte nie funktionieren, weil es die importierten Module ändert. Es gibt einfach keine Möglichkeit, dass Django so arbeiten könnte, wie Python auf dieser Ebene funktioniert - es müsste in der Lage sein, Module zu "unimport", was grundsätzlich unmöglich ist (die einzige Möglichkeit besteht darin, den Prozess neu zu starten), und es gibt noch andere Probleme mit Cross-App-Links.

1

AFAIK gibt es keine Dokumentation, deren Einstellungen zur Laufzeit sicher änderbar sind, aber es gibt eine open ticket, die fordert, dass sie deutlicher dokumentiert werden.

+0

Wie wäre es mit der eigenen Einstellungsvariablen? z.B. Erstellen Sie in den Einstellungen ein leeres Wörterbuch, und fügen Sie während des Zeitraums, in dem das System ausgeführt wird, Daten hinzu (in diesem Fall ist es irrelevant, wenn die Daten bei einem Systemneustart verloren gehen). – Derek

1

Wenn Sie ein look under the hood an dem Einstellungsobjekt nehmen, das Django für die Schnittstelle mit dem Einstellungsmodul Ihres Projekts verfügbar macht, werden Sie feststellen, dass Sie nichts daran hindern können, die Einstellungen zur Laufzeit dynamisch zu ändern. Die Architektur des Frameworks basiert jedoch auf einem Anfrage-Antwort-Fluss, bei dem ein großer globaler Status zwischen Threads für die Speicheroptimierung geteilt wird, basierend auf der Prämisse, dass die Anwendung während der Initialisierung nur einmal konfiguriert wird .

Verwandte Themen