Ist es möglich, Django-Apps zur Laufzeit dynamisch zu laden? Normalerweise werden Apps bei der Initialisierung geladen, indem das INSTALLED_APPS-Tupel in settings.py verwendet wird. Ist es jedoch möglich, zusätzliche Anwendungen zur Laufzeit zu laden? Ich stoße auf dieses Problem in verschiedenen Situationen. Eine Situation entsteht zum Beispiel beim Testen, wenn ich Apps dynamisch laden oder entladen möchte.
Um das Problem konkreter zu machen, stell dir vor, ich hätte ein Verzeichnis mit dem Namen apps
, in das ich meine Apps lege, und ich möchte automatisch jede neue App installieren, die dorthin gelangt, ohne die settings.py manuell zu bearbeiten.
Das ist einfach genug. Befolgen Sie den Beispielcode in
Wir fügen den folgenden Code in settings.py
ein, um die Namen aller Unterverzeichnisse im App-Verzeichnis zu durchlaufen und das INSTALLED_APPS
-Tupel in settings.py
wie folgt zu erhöhen:
Danach, wenn ich in einer Django-Shell war, könnte ich etwas wie
%Vor% und die Apps würden in settings.INSTALLED_APPS
aufgelistet. Und wenn ich es tat
das würde die notwendigen db Tabellen für die apps erstellen.
Wenn ich nun jedoch dem Verzeichnis apps/
weitere Apps hinzufügen würde, ohne sie neu zu starten, würden diese nicht in settings.INSTALLED_APPS aufgeführt, und ein nachfolgender Aufruf von syncdb
hätte keine Auswirkungen .
Was ich gerne wissen möchte, ist, ob ich etwas tun kann - ohne neu zu starten - um die Einstellungen neu zu laden und neue Apps zu laden / zu installieren.
Ich habe versucht, mein settings.py
, d. h.
aus meinen Projekteinstellungen importieren
und dann reload
that settings
mit dem eingebauten Python, nachdem sich ein app
Verzeichnis geändert hat. Obwohl settings.INSTALLED_APPS jetzt geändert wird, um die neu hinzugefügten Apps einzuschließen, macht dies letztlich keinen Unterschied. Zum Beispiel
zeigt nur die Original-Apps in apps
und nicht die neu hinzugefügten und ebenso
sieht die neu hinzugefügten Apps nicht.
Wie ich oben erwähnt habe, denke ich über diese Situation besonders im Zusammenhang mit Tests nach, bei denen ich Apps dynamisch hinzufügen oder entfernen würde.
Ps. Ich arbeite mit django 1.6, aber auf Empfehlung von @RickyA sehe ich, dass es einige wesentliche Änderungen bei der Behandlung von Anwendungen in 1.7 gibt.
Ich bin mir immer noch nicht sicher, was das für das Problem bedeuten könnte, dem ich gegenüberstehe.
Um meine eigene Frage zu beantworten ...
Obwohl ich keine vollständige Lösung für dieses Problem habe, verfüge ich über eine, die ausreicht, um Apps während des Tests dynamisch zu laden.
Die grundlegende Lösung ist einfach und ich fand sie unter ein kleiner bixly Blog .
Wenn ich mit meinem obigen Beispiel fortfahre, wenn ich in einer Django-Shell war und einige neue Apps hinzufügen und laden wollte, die meinem apps
-Verzeichnis hinzugefügt wurden, konnte ich
und dann
%Vor%Tags und Links python django django-settings django-apps