python标准库wsgiref源码阅读

1. server类继承关系一览

socketserver.BaseServer -> socketserver.TCPServer -> http.HTTPServer

socketserver.BaseServer

1). 实例化需要两个参数

server_address:

RequestHandlerClass

图片.png

2). 启动方法

  • serve_forever(self, poll_interval=0.5)

    一直接受请求直到客户端关闭连接

图片.png
  • handle_request:处理单个请求
图片.png
图片.png

socketserver.TCPServer

继承了 BaseServer。

图片.png

实例化后会立即调用以下方法:

server_bind: socket.bind(self.server_address)

server_activate: self.socket.listen(self.request_queue_size)

server_close: self.socket.close()

http.HTTPServer

继承了socketserver.TCPServer,复写了server_bind方法

图片.png

2. handler类继承关系一览

BaseRequestHandler -> StreamRequestHandler -> socketserver.BaseRequestHandler

socketserver.BaseRequestHandler

图片.png

基类,实例化后会立即调用handle()finish()方法。

StreamRequestHandler

继承了socketserver.BaseRequestHandler

图片.png

BaseHTTPRequestHandler

继承了StreamRequestHandler

图片.png

WSGIRequestHandler

继承了BaseHTTPRequestHandle

图片.png

3. 程序入口

调用 handle_request() 将会启动服务,处理完一条请求后会关闭。

图片.png
图片.png

调用 server = server_class((host, port), handler_class) 实例化将会触发socketserver.TCPServer__init__里面的方法server_bind()server_activate()server_close();还会触发BaseRequestHandler.__init__里面的handle()finish()方法。

( 其中server_bind()handle()被复写,实际调用的是WSGIServer.server_bind()WSGIRequestHandler.handle()

server.set_app(app)将 demo_app 传给 handler application属性

在执行这句httpd.handle_request()后会调用start_response()方法。

图片.png
图片.png
图片.png

你可能感兴趣的:(python标准库wsgiref源码阅读)