Django 默认启动的服务器是怎么同时响应多个请求的

进入 django 库的代码文件夹,搜索 "import socket"
看到

core/management/commands/runserver.py
import socket

一步步点进去看看

  • runserver.py
    • run()
      • inner_run()
        1. 打印 Django 启动时的基本信息, “Performing system checks...”, 系统版本之类信息
        2. handler = self.get_handler(*args, **options), 返回默认的 WSGI handler -> WSGIHandler 对象(core/handlers/wsgi.py)
        3. run(self.addr, int(self.port), handler, ipv6=self.use_ipv6, threading=threading, server_cls=self.server_cls)
          • server_cls 是 WSGIServer
          • 跳转到 basehttp.py -> run()
            • 如果多线程: httpd_cls = type('WSGIServer', (socketserver.ThreadingMixIn, server_cls), {})
            • 如果单线程 httpd_cls = server_cls, 直接 WSGIServer
            • httpd = httpd_cls(server_address, WSGIRequestHandler, ipv6=ipv6)
              • 最终是传入 addr,handler,创建一个 TCPServer() 对象,
            • httpd.serve_forever()
其实就是
  • 单线程: wsgiref/simple_server.py -> class WSGIServer -> TCPServer -> BaseServer -> process_request()
  • 多线程: socketserver.py -> ThreadingMixIn -> process_request()
    • 多线程中新开了线程来处理 process_request()
学到的一个用法

httpd_cls = type('WSGIServer', (socketserver.ThreadingMixIn, server_cls), {})
type('String', (), {}')socketserver.ThreadingMixIn, server_cls 为父类创建一个新的类型, 第一个参数是类名,第二个参数是父类,第三个参数是属性字典

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容