我是 Django 的新手。我想我犯了一个简单的错误。
我用 Pydev 启动了开发服务器:
R点击项目>>Django>>自定义命令>>运行服务器
服务器上来了,一切都很好。但现在我试图阻止它,但不知道如何。我在 PyDev 控制台中停止了该过程,并关闭了 Eclipse,但仍然从http://127.0.0.1:8000提供网页。
我通常从命令行启动并退出服务器:
python manage.py runserver
但是服务器还在。我在这里做错了什么?
默认情况下,runserver 命令以自动重载模式运行,该模式在单独的进程中运行。这意味着 PyDev 不知道如何停止它,也不会在控制台窗口中显示其输出。
如果您runserver --noreload
改为运行该命令,则自动重新加载器将被禁用。然后就可以看到控制台输出并正常停止服务器了。但是,这意味着在您手动重新启动服务器之前,对 Python 文件的更改不会生效。
运行项目 1. 右键单击项目(不是子文件夹) 2. 运行方式 > Pydev:Django
终止 1. 在控制台窗口中单击终止
服务器已关闭
我通常从控制台运行它。从 PyDev 运行会增加不必要的混乱,并且在您碰巧使用 PyDev 的 GUI 交互式调试之前不会带来任何好处。
编辑:最新的 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
解决方案:在某些项目文件中创建解释器错误。这将导致服务器崩溃。然后可以正常重新启动服务器。
如果您使用 CMD 在 Windows 上操作:使用CTRL+退出服务器BREAK。
python manage.py runserver localhost:8000
您可以通过单击Ctrl
+Pause
键退出。请注意,可能会调用 Pause 键Break
,并且在某些笔记本电脑中它是使用组合Fn
+进行的F12
。希望这可能会有所帮助。