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

xlpyo6sf  于 2022-12-05  发布在  Go
关注(0)|答案(8)|浏览(191)

我是 Django 的新手,我想我犯了个小错误.
我用Pydev启动了dev服务器:
点击项目〉〉Django〉〉自定义命令〉〉runserver
服务器启动了,一切都很好。但现在我试图停止它,但不知道如何停止。我在PyDev控制台中停止了该进程,并关闭了Eclipse,但网页仍在从**http://127.0.0.1:8000**提供服务。
我从命令行正常启动并退出服务器:

python manage.py runserver

但服务器还在运行我哪里做错了

x759pob2

x759pob21#

默认情况下,runserver命令在autoroload模式下运行,它在一个单独的进程中运行,这意味着PyDev不知道如何停止它,也不会在控制台窗口中显示它的输出。
如果你运行命令runserver --noreload,自动重载器将被禁用。然后你可以看到控制台的输出并正常停止服务器。然而,这意味着对Python文件的更改将在你手动重启服务器后生效。

ut6juiuv

ut6juiuv2#

运行项目1.右键单击项目(不是子文件夹)2.运行方式〉Pydev:Django
终止1.在控制台窗口中单击终止
服务器已关闭

r55awzrz

r55awzrz3#

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

mwecs4sa

mwecs4sa4#

编辑:最新的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本身的一个bug: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
o4tp2gmn

o4tp2gmn5#

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

2skhul33

2skhul336#

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

python manage.py runserver localhost:8000
ijnw1ujt

ijnw1ujt7#

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

7gcisfzg

7gcisfzg8#

运行sudo lsof -i:8000
然后运行kill-9 #PID应该可以终止运行该服务器的进程。然后您可以manage.py再次在该端口上运行python www.example.com服务器

相关问题