Я работаю с Django и все время использую оболочку Django. Раздражает то, что, хотя сервер Django перезагружается при изменении кода, оболочка этого не делает, поэтому каждый раз, когда я вношу изменение в метод, который тестирую, мне нужно выйти из оболочки и перезапустить ее, повторно импортировать все модули, которые я тестирую. необходимо повторно инициализировать все переменные, которые мне нужны, и т. д. Хотя история iPython позволяет сэкономить много времени на вводе текста, это все еще проблема. Есть ли способ сделать автоматическую перезагрузку оболочки django, как это делает сервер разработки django?
Я знаю о reload (), но я импортирую много моделей и обычно использую from app.models import *
синтаксис, поэтому reload () не очень помогает.
Ответы:
Я рекомендую использовать проект django-extensions, как указано выше, от dongweiming. Но вместо команды управления shell_plus используйте:
В вашем браузере откроется блокнот 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'
Также работает, если что-то было импортировано до
%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
команды и трех стратегий автоматической перезагрузки:Обычно это хорошо работает для меня, но есть некоторые оговорки:
источник
/manage.py shell_plus
... если вы наберете,%load_ext autoreload
а затем%autoreload 2
, модели будут автоматически перезагружены.Мое решение - я пишу код и сохраняю его в файл, а затем использую:
Так что я могу внести изменения, сохранить и снова запустить эту команду, пока не исправлю то, что пытаюсь исправить.
источник
exit()
в конец файла py, чтобы упростить выход из оболочки Django. Спасибо.посмотрите на команду manage.py shell_plus, предоставленную проектом django-extensions . Он загрузит все файлы вашей модели при запуске оболочки. и автоматически перезагрузите любое изменение, но не нужно выходить, вы можете напрямую позвонить туда
источник
Похоже, что общее мнение по этой теме заключается в том, что python reload () - отстой, и нет хорошего способа сделать это.
источник
Мое решение для этого неудобства следующее. Я использую 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
Надеюсь, поможет. Конечно, это для отладки.
Ура.
источник
Reload () не работает в оболочке Django без некоторых хитростей. Вы можете проверить эту тему и мой ответ конкретно:
Как перезагрузить модуль модели Django с помощью интерактивного интерпретатора через "manage.py shell"?
источник
Используйте shell_plus с конфигурацией ipython. Это будет
autoreload
включено до того, как shell_plus что-нибудь автоматически импортирует.Отредактируйте свой профиль ipython (
~/.ipython/profile_default/ipython_config.py
):c.InteractiveShellApp.exec_lines = ['%autoreload 2'] c.InteractiveShellApp.extensions = ['autoreload']
Откройте оболочку - обратите внимание, что вам не нужно включать
--ipython
:Теперь все, что определено в
SHELL_PLUS_PRE_IMPORTS
orSHELL_PLUS_POST_IMPORTS
( docs ), будет автоматически перезагружено!Обратите внимание, что если ваша оболочка находится в отладчике (например
pdb.set_trace()
), когда вы сохраняете файл, это может помешать перезагрузке.источник
Вместо того , чтобы выполнять команды из Джанго оболочки, вы можете настроить команду управления , как так и повторите , что каждый раз.
источник
Используя комбинацию двух ответов для этого, я придумал простой однострочный подход.
Вы можете запустить оболочку django с помощью -c, которая будет запускать переданные вами команды, однако она завершается сразу после запуска кода.
Хитрость заключается в том, чтобы настроить то, что вам нужно, запустить code.interact (local = locals ()), а затем повторно запустить оболочку из кода, который вы передаете. Как это:
python manage.py shell -c 'import uuid;test="mytestvar";import code;code.interact(local=locals())'
Мне просто нужен метод проверки из богатой библиотеки. Всего несколько строк:
python manage.py shell -c 'import code;from rich import pretty;pretty.install();from rich import inspect;code.interact(local=locals())'
Наконец, вишенка на вершине - это псевдоним
alias djshell='python manage.py shell -c "import code;from rich import pretty;pretty.install();from rich import inspect;code.interact(local=locals())"'
Теперь, если я запускаю свою оболочку и говорю, хочу проверить класс формы, я получаю прекрасный результат:
источник
Не совсем то, что вам нужно, но сейчас я стараюсь создавать себе команды управления для тестирования и возни с вещами.
В команде вы можете настроить группу локальных пользователей так, как вам нужно, а затем перейти в интерактивную оболочку.
import code class Command(BaseCommand): def handle(self, *args, **kwargs): foo = 'bar' code.interact(local=locals())
Без перезагрузки, но это простой и менее раздражающий способ интерактивного тестирования функциональности django.
источник