当我用Ctrl + C退出Django manage.py runserver
时,运行HTTP请求的线程是否正确完成或者它们是否在中间被中断?
TL;在django dev服务器上按下Ctrl + C时,停止运行HTTP请求的DR
我认为你的问题非常有趣并且已经调查过:
我提出了一个需要10秒钟才能执行的视图,然后发送响应。为了测试您的行为,我使用Ctrl + C停止了开发服务器manage.py runserver
并检查了结果。
我的基础测试:
class TestView ( generic.View ):
def get ( self, request ):
import time
time.sleep(10)
response = HttpResponse('Done.')
return response
Done.
到目前为止一切都如预期。但是我玩了一下,因为python中的Ctrl + C并不是一个完整的停止,但实际上处理起来相当方便:一旦Ctrl + C被击中,一个KeyboardInterrupt
即异常上升(相当于此):
raise KeyboardInterrupt()
所以在基于命令行的程序中,您可以输入以下内容:
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
Slept for: 10s
所以这里的行为没有变化。出于兴趣,我改变了一条线,但结果没有改变;我用了
slept_for = 1000*1000
代替
time.sleep( 0.1 )
所以最后回答你的问题:在Ctrl + C上,开发服务器立即关闭,运行的http-requets没有完成。