当我退出Django的manage.py runserver
与按Ctrl +Ç,也正在运行的线程的HTTP请求完成正确或者他们在中途中断?`manage.py runserver`和Ctrl + C(Django的)
2
A
回答
3
TL; DR运行HTTP请求停止时按Ctrl + Ç被击中的Django开发服务器
我觉得你的问题是真的很有趣,研究了:
我做了一个视图需要10秒钟才能执行,然后发送响应。 要测试您的行为,我停止了开发服务器manage.py runserver
使用Ctrl + C并检查结果。
我的基本测试:
class TestView (generic.View):
def get (self, request):
import time
time.sleep(10)
response = HttpResponse('Done.')
return response
- 正常执行(10S运行时):显示MSG
Done.
- 中断执行(Ctrl键 + Ç请求正在运行时):浏览器误差,主机无法联系到
到目前为止everythin如预期的那样。但我打得四处一点点,因为按Ctrl + Ç在巨蟒不是一个句号,但实际处理而方便:只要按Ctrl + Ç被击中,一个KeyboardInterrupt
又名的例外的是上升(相当于本):
raise KeyboardInterrupt()
所以在您的基于命令行的PROGRAMM你可以把以下内容:
try:
some_action_that_takes_a_while()
except KeyboardInterrupt:
print('The user stopped the programm.')
移植到DJANGO新视图看起来像这样:
def get (self, request):
import time
slept_for = 0
try:
for i in range(100):
slept_for += 0.1
time.sleep(0.1)
except KeyboardInterrupt:
pass
response = HttpResponse('Slept for: ' + str(slept_for) + 's')
return response
- 正常执行(10S运行时):显示MSG
Slept for: 10s
- 中断执行(Ctrl键 + Ç而请求正在运行):浏览器错误,无法访问主机
所以没有改变在这里的行为。出于兴趣,我改变了一行,但结果没有改变;我用
slept_for = 1000*1000
,而不是
time.sleep(0.1)
所以最后回答你的问题:在按Ctrl + ç开发服务器立即关闭正在运行的HTTP requets是没有完成。
+2
默认情况下,'manage.py runserver'使用守护线程来提供响应,这意味着一旦主线程完成,整个进程就会关闭,并且不会等待任何守护线程完成。由于在主线程中触发了'KeyboardInterrupt',它没有提供任何响应,所以无法在视图中捕获它,并且所有守护进程线程都立即退出。这就是为什么你的第二个例子仍然没有完成回应。 – knbk
相关问题
- 1. python3 manage.py runserver
- 2. 蟒蛇./store/manage.py RUNSERVER
- 3. PyCharm manage.py runserver错误
- 4. manage.py runserver命令
- 5. manage.py runserver命令失败
- 6. 无法运行“python manage.py runserver”
- 7. Django /manage.py runserver不起作用(Windows)
- 8. Django:'python manage.py runserver'给出“Segmentation fault”错误
- 9. 在Jython上使用Django管理manage.py runserver
- 10. Django manage.py runserver无法打开浏览器
- 11. Django manage.py runserver不显示“欢迎页面”
- 12. python manage.py runserver分割错误
- 13. manage.py runserver错误:[Errno 10013]
- 14. Django和Python的manage.py runserver命令执行错误
- 15. 执行python manage.py runserver时出错
- 16. 蟒蛇manage.py runserver命令失败
- 17. 蟒蛇manage.py runserver命令错误django.core.exceptions.ImproperlyConfigured:T
- 18. 了解django-admin runserver和mange.py runserver之间的区别
- 19. 当我运行manage.py时,Python.exe崩溃runserver
- 20. $ manage.py runserver/system/bin/sh:manage.py:找不到
- 21. 可以manage.py runserver执行npm脚本吗?
- 22. 运行manage.py后保持PowerShell打开runserver
- 23. manage.py runserver不能正常工作
- 24. manage.py runserver命令不会终止
- 25. Django的manage.py测试无法看到urls.py,虽然能的runserver
- 26. Django:Override Debug = True from manage.py runserver命令
- 27. 通过python manage.py runserver将django部署到VPS上的产品
- 28. IndentationError运行manage.py runserver命令Django的时候
- 29. 做PY -3.5 manage.py runserver命令时,语法错误的Django(1.10.1)
- 30. 的Django的runserver找不到Django的
我认为Ctrl + C杀死了与主线程相关的进程和所有子进程。所以他们会在中间被打断。您可以使用ps -eLf(linux,unix)列出所有线程作为双重确认的手段。 – reticentroot