PyDev и Django: как перезапустить сервер Dev?

Я новичок в Джанго. Я думаю, что делаю простую ошибку.

Я запустил сервер разработки с Pydev:

R Щелкните по проекту >> Django >> Пользовательская команда >> runserver

Сервер подошел, и все было отлично. Но сейчас я пытаюсь это остановить и не могу понять, как. Я остановил процесс в консоли PyDev и закрыл Eclipse, но веб-страницы по-прежнему обслуживаются с http://127.0.0.1:8000/.

Я запустил сервер и вышел из командной строки в обычном режиме:

python manage.py runserver

Но сервер все еще работает. Что я здесь не так делаю?

8 ответов

По умолчанию команда runserver выполняется в режиме автозагрузки, который выполняется в отдельном процессе. Это означает, что PyDev не знает, как его остановить, и не отображает его вывод в окне консоли.

Если вы запустите команду runserver --noreload вместо этого автозагрузчик будет отключен. Затем вы можете увидеть вывод консоли и нормально остановить сервер. Однако это означает, что изменения в ваших файлах Python не вступят в силу, пока вы не перезапустите сервер вручную.

Запустите проект 1. Щелкните правой кнопкой мыши проект (не подпапки) 2. Запустите как> Pydev:Django

Завершить 1. Нажмите "Завершить" в окне консоли.

Сервер не работает

Я обычно запускаю его с консоли. Запуск из PyDev добавляет ненужную путаницу и не приносит никакой пользы, пока вы не используете интерактивную отладку PyDev с графическим интерфейсом.

Редактировать: последние версии PyDev (начиная с PyDev 3.4.1) больше не нуждаются в обходном пути:

То есть: PyDev будет корректно уничтожать подпроцессы при выполнении операции уничтожения, и при отладке даже при обычной перезагрузке PyDev подключит отладчик к дочерним процессам.


Старый ответ (для версий PyDev старше 3.4.1):

К сожалению, это ожидаемо, так как PyDev просто уничтожит родительский процесс (то есть: как будто вместо ctrl+C вы уничтожите родительский процесс в диспетчере задач).

Решением будет редактирование самого Django так, чтобы дочерний процесс опрашивал родительский процесс, чтобы узнать, что он все еще жив, и завершать работу, если это не так... см.: Как заставить дочерний процесс умереть после выхода из родительского процесса? для справки.

После быстрого просмотра он кажется связанным с django / utils / autoreload.py и тем, как он запускает вещи, поэтому необходимо запустить поток, который продолжает видеть, жив ли родитель, а если нет, то убивает дочерний процесс - я сообщил об этом как об ошибке в самом Django: https://code.djangoproject.com/ticket/16982

Примечание: в качестве обходного пути для PyDev вы можете заставить Django выделять новую консоль (вне PyDev), все еще работая из PyDev (так что, пока не будет доступно правильное решение от Django, патч ниже может использоваться для автоматического выделения Django с автозагрузкой). новая консоль - где вы можете правильно использовать Ctrl+C).

Index: django/utils/autoreload.py
===================================================================
--- django/utils/autoreload.py  (revision 16923)
+++ django/utils/autoreload.py  (working copy)
@@ -98,11 +98,14 @@
 def restart_with_reloader():
     while True:
         args = [sys.executable] + ['-W%s' % o for o in sys.warnoptions] + sys.argv
-        if sys.platform == "win32":
-            args = ['"%s"' % arg for arg in args]
         new_environ = os.environ.copy()
         new_environ["RUN_MAIN"] = 'true'
-        exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ)
+
+        import subprocess
+        popen = subprocess.Popen(args, env=new_environ, creationflags=subprocess.CREATE_NEW_CONSOLE)
+        exit_code = popen.wait()
         if exit_code != 3:
             return exit_code

Решение: создать ошибку интерпретатора в каком-либо файле проекта. Это приведет к сбою сервера. Сервер может быть перезапущен как обычно.

Если вы работаете в Windows с использованием CMD: выйдите из сервера, нажав CTRL+BREAK.

python manage.py runserver localhost:8000

Вы можете выйти, нажав Ctrl+ Pause ключи. Обратите внимание, что клавиша Pause может быть вызвана Break а в некоторых ноутбуках это сделано с использованием комбинации Fn + F12, Надеюсь, это поможет.

бегатьsudo lsof -i:8000

затем бегиkill -9 #PIDдолжен работать, чтобы убить процессы, на которых работает этот сервер. то вы можете снова запустить сервер python manage.py на этом порту

Другие вопросы по тегам