17

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

我用 Pydev 启动了开发服务器:

R点击项目>>Django>>自定义命令>>运行服务器

服务器上来了,一切都很好。但现在我试图阻止它,但不知道如何。我在 PyDev 控制台中停止了该过程,并关闭了 Eclipse,但仍然从http://127.0.0.1:8000提供网页。

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

python manage.py runserver

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

4

7 回答 7

14

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

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

于 2010-04-30T18:25:43.293 回答
5

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

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

服务器已关闭

于 2013-04-06T12:32:43.090 回答
4

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

于 2010-04-30T17:52:50.733 回答
3

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

即:PyDev 将在终止进程操作时正确终止子进程,即使在定期重新加载的情况下进行调试时,PyDev 也会将调试器附加到子进程。


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

不幸的是,这是意料之中的,因为 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
于 2011-10-04T13:06:39.440 回答
2

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

于 2010-04-30T18:04:46.190 回答
1

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

python manage.py runserver localhost:8000
于 2012-04-22T07:22:08.173 回答
0

您可以通过单击Ctrl+Pause键退出。请注意,可能会调用 Pause 键Break,并且在某些笔记本电脑中它是使用组合Fn+进行的F12。希望这可能会有所帮助。

于 2014-12-21T16:04:55.897 回答