当我退出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. 蟒蛇./store/manage.py RUNSERVER
- 2. PyCharm manage.py runserver错误
- 3. manage.py runserver命令
- 4. manage.py runserver命令失败
- 5. Django manage.py runserver无法打开浏览器
- 6. Django manage.py runserver不显示“欢迎页面”
- 7. 在Jython上使用Django管理manage.py runserver
- 8. 无法运行“python manage.py runserver”
- 9. Django和Python的manage.py runserver命令执行错误
- 10. 执行python manage.py runserver时出错
- 11. 蟒蛇manage.py runserver命令失败
- 12. $ manage.py runserver/system/bin/sh:manage.py:找不到
- 13. 可以manage.py runserver执行npm脚本吗?
- 14. 运行manage.py后保持PowerShell打开runserver
- 15. manage.py runserver不能正常工作
- 16. Django:Override Debug = True from manage.py runserver命令
- 17. IndentationError运行manage.py runserver命令Django的时候
- 18. 的Django的runserver找不到Django的
- 19. Pycharm中的Django Runserver问题
- 20. Django manage.py runserver得到了AppRegistryNotReady:模型尚未加载
- 21. Python Django manage.py runserver弹出一个记事本
- 22. Django“./manage.py runserver”登录文件而不是控制台
- 23. django manage.py runserver在第二次请求后(间歇性)挂起
- 24. Django manage.py runserver永远不会完成“验证模型”
- 25. 的Django的runserver错误:“NoneType”和“海峡”
- 26. Flask python app.py does not run but manage.py runserver does
- 27. Django 1.4未知命令:'runserver'
- 28. “$ python manage.py runserver”无法正常工作。只有“python3 manage.py运行服务器”
- 29. 的Django的runserver的UnicodeDecodeError
- 30. 错误的runserver和Django在Windows 10
我认为Ctrl + C杀死了与主线程相关的进程和所有子进程。所以他们会在中间被打断。您可以使用ps -eLf(linux,unix)列出所有线程作为双重确认的手段。 – reticentroot