Ich arbeite mit Django und benutze die ganze Zeit die Django-Shell. Der ärgerliche Teil ist, dass der Django-Server bei Codeänderungen zwar neu lädt, die Shell jedoch nicht. Jedes Mal, wenn ich eine zu ändernde Methode ändere, muss ich die Shell beenden und neu starten und alle Module I erneut importieren Ich brauche alle Variablen, die ich brauche, neu zu initialisieren usw. Während der iPython-Verlauf viel Tipparbeit erspart, ist dies immer noch ein Schmerz. Gibt es eine Möglichkeit, das automatische Neuladen der Django-Shell durchzuführen, genauso wie es der Django-Entwicklungsserver tut?
Ich kenne reload (), importiere aber viele Modelle und verwende im Allgemeinen die from app.models import *
Syntax. Daher ist reload () keine große Hilfe.
Antworten:
Ich empfehle die Verwendung des Django-Extensions-Projekts wie oben angegeben durch Dongweiming. Verwenden Sie jedoch anstelle des Verwaltungsbefehls 'shell_plus' Folgendes:
Dadurch wird ein IPython-Notizbuch in Ihrem Webbrowser geöffnet. Schreiben Sie dort Ihren Code in eine Zelle, Ihre Importe usw. und führen Sie ihn aus.
Wenn Sie Ihre Module wechseln, klicken Sie einfach auf den Notebook-Menüpunkt 'Kernel-> Neustart'.
Los geht's, Ihr Code verwendet jetzt Ihre geänderten Module.
quelle
Ich würde vorschlagen, die IPython- Autoreload-Erweiterung zu verwenden .
Ab sofort werden alle importierten Module vor der Auswertung aktualisiert.
Funktioniert auch, wenn vor dem
%load_ext autoreload
Befehl etwas importiert wurde .Es ist auch möglich zu verhindern, dass einige Importe mit
%aimport
Befehls- und 3 Autoreload-Strategien aktualisiert werden:Dies funktioniert im Allgemeinen gut für meinen Gebrauch, aber es gibt einige Cavetas:
quelle
/manage.py shell_plus
... wenn Sie eingeben%load_ext autoreload
und dann%autoreload 2
werden Modelle automatisch neu geladen werden.Schauen Sie sich den Befehl manage.py shell_plus an, der vom Projekt django-extensions bereitgestellt wird . Beim Start der Shell werden alle Ihre Modelldateien geladen. Wenn Sie Ihre Änderungen automatisch laden, aber keinen Exit benötigen, können Sie dort direkt anrufen
quelle
Meine Lösung besteht darin, den Code zu schreiben, in einer Datei zu speichern und dann Folgendes zu verwenden:
So kann ich die Änderung vornehmen, diesen Befehl speichern und erneut ausführen, bis ich alles repariere, was ich zu reparieren versuche.
quelle
exit()
am Ende der py-Datei hinzu, um die Django-Shell sauberer zu verlassen. Vielen Dank.Es scheint, dass der allgemeine Konsens zu diesem Thema darin besteht, dass Python reload () scheiße ist und es keinen guten Weg gibt, dies zu tun.
quelle
Reload () funktioniert in der Django-Shell nicht ohne Tricks. Sie können diesen Thread na und meine Antwort speziell überprüfen:
Wie lade ich ein Django-Modellmodul mit dem interaktiven Interpreter über "manage.py shell" neu?
quelle
Meine Lösung für diese Unannehmlichkeit folgt. Ich benutze IPython.
Für Python 3.x muss 'reload' importiert werden mit:
Ich hoffe es hilft. Natürlich ist es für Debug-Zwecke.
Prost.
quelle
Verwenden Sie shell_plus mit einer ipython-Konfiguration. Dies wird aktiviert,
autoreload
bevor shell_plus automatisch etwas importiert.Bearbeiten Sie Ihr Ipython-Profil (
~/.ipython/profile_default/ipython_config.py
):Öffnen Sie eine Shell - beachten Sie, dass Sie nicht Folgendes einschließen müssen
--ipython
:Jetzt wird alles, was in
SHELL_PLUS_PRE_IMPORTS
oderSHELL_PLUS_POST_IMPORTS
( docs ) definiert ist, automatisch geladen!Beachten Sie, dass wenn sich Ihre Shell beim
pdb.set_trace()
Speichern einer Datei in einem Debugger (z. B.) befindet, dies das Neuladen beeinträchtigen kann.quelle
Statt Befehle aus dem Django - Shell ausgeführt wird , können Sie einen Management - Befehl einrichten wie so und erneut ausgeführt , dass jedes Mal.
quelle
Nicht genau das, was Sie wollen, aber ich neige jetzt dazu, mir Verwaltungsbefehle zum Testen und Herumspielen zu erstellen.
Mit dem Befehl können Sie eine Reihe von Einheimischen nach Ihren Wünschen einrichten und anschließend in eine interaktive Shell einfügen.
Kein Nachladen, aber eine einfache und weniger nervige Möglichkeit, die Django-Funktionalität interaktiv zu testen.
quelle