127 Stimmen

Wie lädt man Module in der Django-Shell neu?

Ich arbeite mit Django und benutze die Django-Shell ständig. Der lästige Teil ist, dass während der Django-Server auf Code-Änderungen neu geladen wird, die Shell nicht, so dass jedes Mal, wenn ich eine Änderung an einer Methode, die ich teste, muss ich die Shell beenden und neu starten, re-importieren alle Module, die ich brauche, reinitialisieren alle Variablen, die ich brauche usw. Die iPython-Historie erspart mir zwar eine Menge Tipparbeit, aber das ist immer noch ein Problem. Gibt es eine Möglichkeit, die django shell automatisch neu zu laden, so wie es der django development server tut?

Ich weiß über reload() Bescheid, aber ich importiere viele Modelle und verwende im Allgemeinen from app.models import * Syntax, daher ist reload() keine große Hilfe.

2 Stimmen

Sie sollten diese Frage aktualisieren und die Antwort "django-extensions" als richtig markieren.

1 Stimmen

Erst wenn es für mich tatsächlich funktioniert. Ich habe die Erweiterungen installiert, aber keiner meiner Codes wird automatisch neu geladen, und in den shell_plus-Dokumenten wird das automatische Laden nicht erwähnt. Es scheint, dass es einen Reloader im runserver_plus-Befehl gibt, aber das ist nicht das, wonach ich suche.

17voto

andorov Punkte 3961

Utilice Muschel_plus mit einer ipython-Konfiguration. Dies ermöglicht autoreload bevor shell_plus automatisch etwas importiert.

pip install django-extensions
pip install ipython
ipython profile create

Bearbeiten Sie Ihr ipython-Profil ( ~/.ipython/profile_default/ipython_config.py ):

c.InteractiveShellApp.exec_lines = ['%autoreload 2']
c.InteractiveShellApp.extensions = ['autoreload']

Öffnen Sie eine Shell - beachten Sie, dass Sie nicht die --ipython :

python manage.py shell_plus

Jetzt wird alles, was in SHELL_PLUS_PRE_IMPORTS ou SHELL_PLUS_POST_IMPORTS ( docs ) wird automatisch geladen!

Beachten Sie, dass, wenn sich Ihre Shell in einem Debugger befindet (z.B. pdb.set_trace() ), wenn Sie eine Datei speichern, kann dies das erneute Laden beeinträchtigen.

4 Stimmen

Ich danke Ihnen für die Antwort. Sie sollten allerdings beachten, dass ich die Frage im Jahr 2010 gestellt habe. Ich bin froh zu wissen, dass nach acht Jahren auto-reload in shell_plus endlich funktioniert :)

0 Stimmen

Ich habe dies versucht, es hat nicht funktioniert, ich habe auch zu SHELL_PLUS_PRE_IMPORTS y SHELL_PLUS_POST_IMPORTS

0 Stimmen

Das ist sehr hübsch

8voto

Roque Punkte 351

Meine Lösung für diese Unannehmlichkeit ist folgende. Ich verwende IPython.

$ ./manage.py shell
> import myapp.models as mdls   # 'mdls' or whatever you want, but short...
> mdls.SomeModel.objects.get(pk=100)
> # At this point save some changes in the model
> reload(mdls)
> mdls.SomeModel.objects.get(pk=100)

Für Python 3.x muss "reload" mit importiert werden:

from importlib import reload

Ich hoffe, es hilft. Natürlich ist es für Debug-Zwecke.

Salud.

4voto

Tomasz Zieliński Punkte 15606

Reload() funktioniert in der Django-Shell nicht ohne einige Tricks. Sie können diesen Thread na und meine Antwort speziell überprüfen:

Wie lädt man ein Django-Modellmodul mit dem interaktiven Interpreter über die "manage.py shell" neu?

3voto

John J Punkte 31

Mit einer Kombination aus 2 Antworten habe ich einen einfachen einzeiligen Ansatz gefunden.

Sie können die django-Shell mit -c starten, die dann die übergebenen Befehle ausführt kündigt unmittelbar nach der Ausführung des Codes.

Der Trick besteht darin, die benötigten Einstellungen vorzunehmen, code.interact(local=locals()) auszuführen und dann die Shell mit dem übergebenen Code neu zu starten. Etwa so:

python manage.py shell -c 'import uuid;test="mytestvar";import code;code.interact(local=locals())'

Ich wollte nur die Inspektionsmethode der Rich Library. Nur ein paar Zeilen:

python manage.py shell -c 'import code;from rich import pretty;pretty.install();from rich import inspect;code.interact(local=locals())'

Die Kirsche auf dem Sahnehäubchen ist schließlich ein Alias

alias djshell='python manage.py shell -c "import code;from rich import pretty;pretty.install();from rich import inspect;code.interact(local=locals())"'

Wenn ich nun meine Shell starte und sage, ich möchte die Formularklasse untersuchen, erhalte ich diese schöne Ausgabe: enter image description here

2voto

toabi Punkte 3508

Nicht genau das, was Sie wollen, aber ich neige jetzt dazu, mir selbst Verwaltungsbefehle zum Testen und Tüfteln zu erstellen.

In dem Befehl können Sie eine Reihe von Locals so einrichten, wie Sie es wünschen, und anschließend in eine interaktive Shell wechseln.

import code

class Command(BaseCommand):
  def handle(self, *args, **kwargs):
     foo = 'bar'
     code.interact(local=locals())

Kein Neuladen, aber ein einfacher und weniger lästiger Weg, Django-Funktionen interaktiv zu testen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X