Pracuję z Django i cały czas używam powłoki Django. Irytujące jest to, że podczas gdy serwer Django przeładowuje się po zmianie kodu, powłoka nie ładuje się, więc za każdym razem, gdy zmieniam metodę, którą testuję, muszę zamknąć powłokę i ponownie ją zaimportować, ponownie zaimportować wszystkie moduły. potrzebuję, ponownie zainicjuj wszystkie potrzebne mi zmienne itp. Chociaż historia iPythona oszczędza wiele pisania na ten temat, nadal jest to uciążliwe. Czy istnieje sposób na automatyczne przeładowanie powłoki django, tak samo jak robi to serwer deweloperski django?
Wiem o reload (), ale importuję wiele modeli i ogólnie używam from app.models import *
składni, więc reload () niewiele pomaga.
Odpowiedzi:
Polecam używanie projektu django-extensions, jak wspomniano powyżej przez dongweiming. Ale zamiast tylko polecenia zarządzania „shell_plus”, użyj:
Spowoduje to otwarcie notatnika IPython w Twojej przeglądarce internetowej. Napisz swój kod w komórce, importuj itp. I uruchom go.
Gdy zmienisz moduły, po prostu kliknij pozycję menu notatnika „Jądro-> Uruchom ponownie”
Proszę bardzo, twój kod używa teraz zmodyfikowanych modułów.
źródło
Sugerowałbym użycie rozszerzenia autoreload IPython .
./manage.py shell In [1]: %load_ext autoreload In [2]: %autoreload 2
Odtąd wszystkie zaimportowane moduły będą odświeżane przed oceną.
In [3]: from x import print_something In [4]: print_something() Out[4]: 'Something' # Do changes in print_something method in x.py file. In [5]: print_something() Out[5]: 'Something else'
Działa również, jeśli coś zostało zaimportowane przed
%load_ext autoreload
poleceniem../manage.py shell In [1]: from x import print_something In [2]: print_something() Out[2]: 'Something' # Do changes in print_something method in x.py file. In [3]: %load_ext autoreload In [4]: %autoreload 2 In [5]: print_something() Out[5]: 'Something else'
Możliwe jest również zapobieganie odświeżaniu niektórych importów za pomocą
%aimport
poleceń i 3 strategii automatycznego przeładowania:Generalnie działa to dobrze dla mojego użytku, ale jest kilka błędów:
źródło
/manage.py shell_plus
... jeśli wpiszesz%load_ext autoreload
a następnie%autoreload 2
, modele zostaną automatycznie przeładowane.spójrz na polecenie manage.py shell_plus udostępniane przez projekt django-extensions . Załaduje wszystkie pliki modelu podczas uruchamiania powłoki. i automatycznie przeładowuj dowolną modyfikację, ale nie potrzebujesz wyjścia, możesz tam bezpośrednio wywołać
źródło
Moim rozwiązaniem jest napisanie kodu i zapisanie go do pliku, a następnie użycie:
Mogę więc wprowadzić zmianę, zapisać i ponownie uruchomić to polecenie, dopóki nie naprawię tego, co próbuję naprawić.
źródło
exit()
na dole pliku py, aby wyjść z powłoki Django w bardziej przejrzysty sposób. Dzięki.Wydaje się, że ogólny konsensus w tym temacie jest taki, że reload () w Pythonie jest do niczego i nie ma na to dobrego sposobu.
źródło
Reload () nie działa w powłoce Django bez pewnych sztuczek. Możesz sprawdzić ten wątek i moją odpowiedź konkretnie:
Jak przeładować moduł modelu Django za pomocą interaktywnego interpretera przez "powłokę manage.py"?
źródło
Oto moje rozwiązanie tego niewygodnego rozwiązania. Używam 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)
W przypadku Pythona 3.x „reload” należy zaimportować za pomocą:
from importlib import reload
Mam nadzieję, że to pomoże. Oczywiście służy to do debugowania.
Twoje zdrowie.
źródło
Użyj shell_plus z konfiguracją ipython. Umożliwi to
autoreload
zanim shell_plus automatycznie zaimportuje cokolwiek.Edytuj swój profil ipython (
~/.ipython/profile_default/ipython_config.py
):c.InteractiveShellApp.exec_lines = ['%autoreload 2'] c.InteractiveShellApp.extensions = ['autoreload']
Otwórz powłokę - pamiętaj, że nie musisz dołączać
--ipython
:Teraz wszystko zdefiniowane w
SHELL_PLUS_PRE_IMPORTS
orSHELL_PLUS_POST_IMPORTS
( docs ), zostanie automatycznie załadowane!Zauważ, że jeśli twoja powłoka jest w debugerze (ex
pdb.set_trace()
), kiedy zapisujesz plik, może to zakłócić ponowne załadowanie.źródło
Zamiast uruchamiać polecenia z Django powłoki, można skonfigurować polecenie zarządzania podobnie jak i powtórka, że za każdym razem.
źródło
Nie jest to dokładnie to, czego chcesz, ale teraz mam tendencję do tworzenia własnych poleceń zarządzania do testowania i majstrowania przy różnych rzeczach.
W poleceniu możesz ustawić grupę lokalnych tak, jak chcesz, a następnie wrzucić do interaktywnej powłoki.
import code class Command(BaseCommand): def handle(self, *args, **kwargs): foo = 'bar' code.interact(local=locals())
Bez przeładowywania, ale łatwy i mniej denerwujący sposób na interaktywne testowanie funkcjonalności django.
źródło