当我使用 Ctrl+C 退出 Django manage.py runserver 时,运行 HTTP 请求的线程是正确完成还是在中间?
请您参考如下方法:
TL;DR 在 django 开发服务器上按下 Ctrl+C 时停止运行 HTTP 请求
我认为你的问题很有趣并且经过了调查:
我制作了一个需要 10 秒执行的 View ,然后发送响应。 为了测试您的行为,我使用 Ctrl+C 停止了开发服务器 manage.py runserver 并检查了结果。
我的基础测试:
class TestView ( generic.View ):
def get ( self, request ):
import time
time.sleep(10)
response = HttpResponse('Done.')
return response
- 正常执行(10 秒运行时间):显示消息
完成。 - 请求运行时中断执行(Ctrl+C):浏览器错误,无法访问主机
目前一切如预期。但我玩了一下,因为 Ctrl+C 在 python 中不是句号,但实际上处理起来相当方便:一旦Ctrl+C 被击中,一个 KeyboardInterrupt 又名 一个 Exception is risen(等同于此):
raise KeyboardInterrupt()
因此在基于命令行的程序中,您可以输入以下内容:
try:
some_action_that_takes_a_while()
except KeyboardInterrupt:
print('The user stopped the programm.')
移植到 django 的新 View 看起来像这样:
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 运行时):显示消息
Slept for: 10s - 请求运行时中断执行(Ctrl+C):浏览器错误,无法访问主机
所以这里的行为没有变化。出于兴趣,我改变了一行,但结果没有改变;我用过
slept_for = 1000*1000
代替
time.sleep( 0.1 )
所以最后回答你的问题:在 Ctrl+C 上,开发服务器立即关闭并且正在运行 http-requets 未完成。
