Как перезагрузить модули в оболочке django?



Я работаю с Django и использую Django shell все время. Раздражающая часть заключается в том, что в то время как сервер Django перезагружается при изменении кода, оболочка этого не делает, поэтому каждый раз, когда я делаю изменения в методе, который я тестирую, мне нужно выйти из оболочки и перезапустить ее, повторно импортировать все модули, которые мне нужны, повторно инициализировать все переменные, которые мне нужны и т. д. В то время как история iPython экономит много набрав на этом, это все еще боль. Есть ли способ сделать автоматическую перезагрузку оболочки django, так же как и разработка django сервер?



Я знаю о reload(), но я импортировать большое количество моделей и, как правило, использовать from app.models import * синтаксис, поэтому reload () не очень помогает.

849   9  

9 ответов:

Я рекомендую использовать проект django-extensions, как указано выше dongweiming. Но вместо того, чтобы просто 'shell_plus' команда управления, используйте:

manage.py shell_plus --notebook

это откроет ноутбук IPython в вашем веб-браузере. Напишите свой код там в ячейке, ваш импорт и т. д. и запустить его.

когда вы меняете свои модули, просто нажмите на пункт меню ноутбука 'ядро - > перезагрузка'

там вы идете, ваш код теперь использует измененные модули.

Я бы предложил использовать 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 и мой ответ конкретно:

Как перезагрузить модуль модели Django с помощью интерактивного интерпретатора через "manage.py Шелл"?

мое решение для этого неудобно следует. Я использую 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

    Ничего не найдено.