Как перезагрузить модули в оболочке django?
Я работаю с Django и постоянно использую оболочку Django. Досадная часть заключается в том, что, когда сервер Django перезагружается при изменениях кода, оболочка не делает этого, поэтому каждый раз, когда я делаю изменение метода, который я тестирую, мне нужно выйти из оболочки и перезапустить ее, повторно импортировать все модули я нужно, повторно инициализировать все переменные, которые мне нужны, и т.д. В то время как история iPython экономит много набрав на этом, это все равно боль. Есть ли способ сделать перезагрузку оболочки django так же, как это делает сервер разработки django?
Я знаю о reload(), но я импортирую много моделей и обычно использую синтаксис from app.models import *
, поэтому перезагрузка() не очень помогает.
Ответы
Ответ 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() сосет и нет хорошего способа сделать это.
Ответ 6
Перезагрузка() не работает в оболочке Django без каких-либо трюков. Вы можете проверить эту ветку na и мой ответ конкретно:
Как вы перезагружаете модуль модели Django с помощью интерактивного интерпретатора через "manage.py shell" ?
Ответ 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.