`manage.py runserver`和Ctrl + C(Django)

问题描述 投票:2回答:1

当我用Ctrl + C退出Django manage.py runserver时,运行HTTP请求的线程是否正确完成或者它们是否在中间被中断?

python django signals
1个回答
3
投票

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
  • 正常执行(10s运行时):显示msg Done.
  • 中断执行(请求运行时按Ctrl + C):浏览器错误,无法访问主机

到目前为止一切都如预期。但是我玩了一下,因为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
  • 正常执行(10s运行时):显示msg Slept for: 10s
  • 中断执行(请求运行时按Ctrl + C):浏览器错误,无法访问主机

所以这里的行为没有变化。出于兴趣,我改变了一条线,但结果没有改变;我用了

slept_for = 1000*1000

代替

time.sleep( 0.1 )

所以最后回答你的问题:在Ctrl + C上,开发服务器立即关闭,运行的http-requets没有完成。

© www.soinside.com 2019 - 2024. All rights reserved.