it-swarm.com.de

Ändern der Django-Einstellungen zur Laufzeit

Ich möchte einige (app-spezifische) Einstellungen in der Admin-Benutzeroberfläche verfügbar machen, damit Benutzer sie bequem ändern können und Django nicht neu starten müssen.

Wie soll ich das machen?

Ich habe die Anwendungen auf http://djangopackages.com/grids/g/live-setting/ ausgecheckt (btw Django-constance war am ansprechendsten), aber in Wirklichkeit speichern all diese Apps Werte in einer Datenbank , bietet eine Weboberfläche zum Ändern und Zwischenspeichern. Sind die ersten beiden Funktionen nicht bereits in Django integriert?

Die größten Nachteile, die ich sehe, sind, dass keine der Apps Drop-In-Ersetzungen für den alten Speicherort dieser Einstellungen (settings.py) sind und dass ich zu ihrer Notation wechseln und oft einen anderen Kontextprozessor hinzufügen muss, um auf sie in Vorlagen zuzugreifen.

Könnte ich das nicht einfach machen?

  1. Erstellen Sie ein Modell für meine Einstellungen (dies gibt mir die verschiedenen Typen und die Validierung)
  2. Instanziieren Sie ein solches Objekt, um meine Einstellungen zu speichern (dies ermöglicht den Benutzern, sie in der Admin-Benutzeroberfläche zu bearbeiten). Ich könnte die Standardeinstellungen als Fixtures wie für andere Modelle sichern
  3. Settings.py so umbrechen, dass eine Datenbankabfrage für meine Einstellungen erfolgt - http://www.loose-bits.com/2011/04/extending-Django-settings-with-derived.html

Aus meiner aktuellen, naiven Sicht wären die einzigen Nachteile, die ich sehe, folgende:

  1. Das Hinzufügen oder Ändern der verfügbaren Einstellungen erfordert eine Schemamigration (Süd). - Ich kann damit leben.
  2. Ich habe ein Modell mit möglicherweise mehreren Instanzen, brauche aber eigentlich nur einen Singleton. - Das könnte tatsächlich eine nützliche Funktion sein.
  3. Leistung/Zwischenspeicherung: http://code.djangoproject.com/svn/Django/trunk/Django/conf/ Ich müsste ein wenig Klugheit in den Einstellungen-Wrapper und/oder das Modell einfügen, damit das Modell die zwischengespeicherten Werte löscht oder aktualisiert. - scheint keine Raketenwissenschaft zu sein.
  4. Dasselbe in einem anderen Projekt zu tun, würde wieder ähnliche Anstrengungen erfordern. - Ich denke, ein einziges Wörterbuch konstant in settings.py, das Modellnamen und Feldnamen für die Suche enthält, ist alles, was sich unterscheiden würde.

Wäre dies nicht das Beste aus beiden Welten - Laufzeitadministrator (mit all seinen Vorteilen), Datenbank-Backend, Caching und keine meiner Einstellungen. Für USED_TO_BE_IN_SETTINGS_DOT_PY müssten Änderungen vorgenommen werden. Fehlt mir etwas?

41
Danny W. Adair

AFAIK, die Django-Einstellungen sollen unveränderlich sein. Dafür gibt es mehrere Gründe. Offensichtlich ist, dass Django das Ausführungsmodell des Servers (Prefork/Multithreading) nicht kennt.

Sie können die Einstellungen selbst nicht aus einem Django-Modell laden, da die Einstellungen geladen werden müssen, bevor Sie etwas im ORM verwenden können.

Im Grunde haben Sie zwei Lösungen:

  • sie können die Einstellungen von der Datenbank aus starten, indem Sie einen untergeordneten Datenbankzugriffsmechanismus verwenden, um sie zu laden. oder
  • sie können Ihre Einstellungen einfach in einem anderen Modell definieren und sie direkt abrufen, wenn Sie sie benötigen.

Der erste ist ein unglaublicher Hack und ich schlage es nicht vor. Die zweite ist viel direkter und sauberer, erfordert jedoch die Änderung Ihrer üblichen Gewohnheiten (from Django.conf import settings).

Der zweite Ansatz ist wahrscheinlich das, was von Drittanbieter-Apps implementiert wird, mit denen Sie verlinkt haben.

16
André Caron
9
Chuck

DATABASES ist ein Dikt. So können Sie wie ein Wörterbuch manipulieren:

import Django.conf as conf

conf.settings.DATABASES['default']['NAME'] = 'novo_banco'
6
arannasousa

Ehrlich gesagt bekomme ich mehr Django, wenn ich seinen Code analysiere. In der Version 1.4.5 (nach dem folgenden Modul):

  • meinprojekt\manage.py

  • Django\core\management__init __. Py ## method - execute_manager

  • Django\conf__init __. Py ## class - LazySettings; attr - _verpackt

  • Django\utils\funktional.py ## class LazyObject; wichtige Methode - new_method_proxy

Funktionale Option, aber es birgt Risiken. Im Python betrachtet "_" das Attribut als geschützt.

from Django.conf import settings

settings._wrapped.INSTALLED_APPS = () ## *really work*

Im folgenden Projekt: https://github.com/alexsilva/DJPlugins Können Sie sehen, dass diese Variable zur Laufzeit geändert wird. Die Idee des Projekts funktioniert bereits.

2
alex

Werfen Sie einen Blick auf: https://bitbucket.org/bkroeze/Django-livesettings * Django-Livesettings ist ein Projekt, das vom Satchmo Project_ getrennt ist. Es bietet die Möglichkeit, Einstellungen über eine Admin-Oberfläche zu konfigurieren, anstatt "settings.py" zu bearbeiten. *

Vielleicht kann es für Sie hilfreich sein.

2
raphaelwct

Sie können die empfohlene .configure()-Methode des settings-Moduls verwenden:

from Django.conf import settings
settings.configure(DEBUG=True)

Das settings-Modul verfügt über zusätzliche praktische Funktionen. Überprüfen Sie docs .

1
Fusion