Как перезагрузить модули в оболочке django?
Я работаю с Django и использую Django shell все время. Раздражающая часть заключается в том, что в то время как сервер Django перезагружается при изменении кода, оболочка этого не делает, поэтому каждый раз, когда я делаю изменения в методе, который я тестирую, мне нужно выйти из оболочки и перезапустить ее, повторно импортировать все модули, которые мне нужны, повторно инициализировать все переменные, которые мне нужны и т. д. В то время как история iPython экономит много набрав на этом, это все еще боль. Есть ли способ сделать автоматическую перезагрузку оболочки django, так же как и разработка django сервер?
Я знаю о reload(), но я импортировать большое количество моделей и, как правило, использовать from app.models import * синтаксис, поэтому reload () не очень помогает.
9 ответов:
Я рекомендую использовать проект django-extensions, как указано выше dongweiming. Но вместо того, чтобы просто 'shell_plus' команда управления, используйте:
manage.py shell_plus --notebookэто откроет ноутбук IPython в вашем веб-браузере. Напишите свой код там в ячейке, ваш импорт и т. д. и запустить его.
когда вы меняете свои модули, просто нажмите на пункт меню ноутбука 'ядро - > перезагрузка'
там вы идете, ваш код теперь использует измененные модули.
посмотрите на manage.py команда shell_plus предоставляется командой django-extensions. Она будет загружать все ваши файлы модели при запуске оболочки. и autoreload ваши любые изменения, но не нужно выходить, вы можете сразу позвонить туда
Я бы предложил использовать IPython расширение автоматической загрузки.
./manage.py shell In [1]: %load_ext autoreload In [2]: %autoreload 2и теперь все импортированные модули будут обновлены перед оценкой.
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'работает также, если что-то было импортировано раньше .
./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'существует возможность также предотвратить некоторые импорт от обновления с
%aimportкомандная и 3 стратегии автоматической загрузки:%autoreload
- обновить все модули (кроме исключенных %aimport) автоматически сейчас.
%autoreload 0
- отключить автоматическую перезагрузку.
%autoreload 1
- перезагрузите все модули, импортированные с %aimport каждый раз перед выполнением набран код Python.
%autoreload 2
- перезагрузить все модули (кроме исключенные %aimport) каждый раз перед выполнением набранного кода Python.
%aimport
- список модулей, которые должны быть автоматически импортированы или не быть импортированный.
%aimport foo
- импортируйте модуль " foo " и отметьте его для автоматической загрузки для %autoreload 1
%aimport-foo
- пометить модуль 'foo', чтобы он не загружался автоматически.
это обычно работает хорошо для моего использования, но есть некоторые cavetas:
- замена объектов кода не всегда удается: изменение свойства @в классе на обычный метод или метод на переменную-член может вызвать проблемы (но только в старых объектах).
- функции, которые будут удалены (напр. через monkey-patching) из модуля перед его перезагрузкой не обновляются.
- модули расширения C не могут быть перезагружены и поэтому не могут быть загружены автоматически.
похоже, что общий консенсус по этой теме заключается в том, что python reload() отстой, и нет хорошего способа сделать это.
мое решение заключается в том, что я пишу код и сохраняю его в файл, а затем использую:
python manage.py shell
поэтому я могу внести изменения, сохранить и снова запустить эту команду, пока не исправлю все, что я пытаюсь исправить.
Reload () не работает в оболочке Django без некоторых трюков. Вы можете проверить эту тему na и мой ответ конкретно:
мое решение для этого неудобно следует. Я использую 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)надеюсь, что это помогает. Конечно, это для отладки.
Ура.
вместо выполнения команд из оболочки Django можно настроить команду управления вот так и повторите это каждый раз.
Не совсем то, что вы хотите, но теперь я склонен создавать себе команды управления для тестирования и возиться с вещами.
в команде вы можете настроить кучу местных жителей так, как вы хотите, а затем перейти в интерактивную оболочку.
import code class Command(BaseCommand): def handle(self, *args, **kwargs): foo = 'bar' code.interact(local=locals())нет перезагрузки, но простой и менее раздражающий способ интерактивного тестирования функциональности django.
Comments