Skip to main content
 首页 » 编程设计

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

2024年08月22日28三少

当我使用 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 未完成。