PyDev和Django:如何重启dev服务器?

时间:2010-04-30 17:41:39

标签: python django eclipse pydev devserver

我是Django的新手。我想我犯了一个简单的错误。

我用Pydev启动了dev服务器:

  

点击项目>> Django>>习惯   命令>>的runserver

服务器出现了,一切都很棒。但是现在我试图阻止它,并且无法弄清楚如何。我在PyDev控制台中停止了该过程,并关闭了Eclipse,但仍然从 http://127.0.0.1:8000 提供网页。

我通常从命令行启动并退出服务器:

python manage.py runserver

但是服务器还在运行。我在这里做错了什么?

7 个答案:

答案 0 :(得分:14)

默认情况下,runserver命令以自动重载模式运行,该模式在单独的进程中运行。这意味着PyDev不知道如何阻止它,也不会在控制台窗口中显示它的输出。

如果您改为运行命令runserver --noreload,则会禁用自动重新加载器。然后您可以看到控制台输出并正常停止服务器。但是,这意味着在手动重新启动服务器之前,对Python文件的更改将无效。

答案 1 :(得分:5)

运行项目1.右键单击项目(不是子文件夹)2。运行方式> Pydev的:Django的

终止1.单击控制台窗口中的终止

服务器已关闭

答案 2 :(得分:4)

我通常从控制台运行它。从PyDev运行会增加不必要的混淆,并且在您碰巧使用PyDev的GUI交互式调试之前不会带来任何好处。

答案 3 :(得分:3)

编辑:最新的PyDev版本(自PyDev 3.4.1起)不再需要任何解决方法:

即:PyDev将在kill进程操作中正确地杀死子进程,并且在调试时甚至定期重新加载,PyDev会将调试器附加到子进程。


旧答案(对于早于3.4.1的PyDev版本):

不幸的是,这是预期的,因为PyDev将简单地杀死父进程(即:好像而不是ctrl + C,你杀死了任务管理器中的父进程)。

解决方案是编辑Django本身,以便子进程轮询父进程以知道它仍处于活动状态,如果不存在则退出...请参阅:How to make child process die after parent exits?以获取参考。

快速查看它似乎与django / utils / autoreload.py及其启动方式有关 - 因此,需要启动一个线程,不断查看父级是否存活以及是否存在它杀死了子进程 - 我已经报告过这是Django本身的一个错误:https://code.djangoproject.com/ticket/16982

注意:作为PyDev的一种解决方法,你可以让Django在仍然从PyDev运行时分配一个新的控制台(在PyDev之外)(因此,直到Django提供了一个合适的解决方案,下面的补丁可以用来制作Django autoreload分配一个新的控制台 - 你可以正确使用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

答案 4 :(得分:2)

解决方案:在某个项目文件中创建解释器错误。这将导致服务器崩溃。然后可以正常重启服务器。

答案 5 :(得分:1)

如果您使用CMD在Windows上操作:使用 CTRL + BREAK 退出服务器。

python manage.py runserver localhost:8000

答案 6 :(得分:0)

您可以点击Ctrl + Pause键退出。请注意,暂停键可能会被称为Break,而在某些笔记本电脑中,它是使用组合Fn + F12制作的。希望这可能有所帮助。