Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

manage.py shell_plus --notebook

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

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

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

Ответ 2

посмотрите команду manage.py shell_plus, предоставленную django-extensions. Он загрузит все ваши файлы модели при запуске оболочки. и автоматически загрузите любое изменение, но не нужно выйти, вы можете направить вызов там

Ответ 3

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

Работает также, если что-то было импортировано до команды %load_ext autoreload.

./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 стратегий автозагрузки:

% автоперезагрузки

  • Перезагрузите все модули (кроме тех, которые исключены% aimport) автоматически Теперь.

% autoreload 0

  • Отключить автоматическую перезагрузку.

% автозагрузки 1

  • Перезагружать все модули, импортированные с помощью% aimport каждый раз перед выполнением набран код Python.

% автозагрузки 2

  • Перезагружать все модули (кроме тех, которые исключены% aimport) каждый раз перед выполнением введенного кода Python.

% aimport

  • Список модулей, которые должны быть автоматически импортированы или не должны быть импортирован.

% aimport foo

  • Импортировать модуль 'foo и пометить его автозагрузкой для% autoreload 1

% aimport -foo

  • Отметьте модуль 'foo, чтобы он не загружался автоматически.

Как правило, это хорошо для моего использования, но есть несколько полос:

  • Замена объектов кода не всегда выполняется: изменение класса @property в классе на обычный метод или метод на переменную-член может вызвать проблемы (но только в старых объектах).
  • Функции, которые удаляются (например, с помощью исправления обезьяны) из модуля до его перезагрузки, не обновляются.
  • Модули расширения C не могут быть перезагружены и поэтому не могут быть загружены автозагрузкой.

Ответ 4

Мое решение: я пишу код и сохраняю файл, а затем использую:

python manage.py shell < test.py

Поэтому я могу внести изменения, сохранить и запустить эту команду еще раз, пока не исправлю все, что я пытаюсь исправить.

Ответ 5

Похоже, что общий консенсус по этой теме заключается в том, что python reload() сосет и нет хорошего способа сделать это.

Ответ 7

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

Для Python 3.x 'reload' должен быть импортирован с помощью:

from importlib import reload

Надеюсь, поможет. Конечно, это для целей отладки.

Приветствия.

Ответ 8

Вместо того, чтобы запускать команды из оболочки Django, вы можете настроить команду управления как это так и повторно запускать это каждый раз.

Ответ 9

Используйте shell_plus с конфигурацией ipython. Это позволит autoreload перед тем shell_plus автоматически импортирует все.

pip install django-extensions
pip install ipython
ipython profile create

Отредактируйте свой профиль ipython (~/.ipython/profile_default/ipython_config.py):

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

Откройте оболочку - обратите внимание, что вам не нужно включать --ipython:

python manage.py shell_plus

Теперь все, что определено в SHELL_PLUS_PRE_IMPORTS или SHELL_PLUS_POST_IMPORTS (документах), будет автоматически перезагружено!

Обратите внимание, что если ваша оболочка находится в отладчике (например, pdb.set_trace()), когда вы сохраняете файл, это может помешать перезагрузке.

Ответ 10

Не совсем то, что вы хотите, но теперь я стараюсь создавать команды управления для тестирования и игры с вещами.

В команде вы можете настроить кучу локалей так, как вы хотите, а затем перейти в интерактивную оболочку.

import code

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

Нет перезагрузки, но простой и менее раздражающий способ интерактивного тестирования функциональности django.