python标准库wsgiref源码阅读
1. server类继承关系一览
socketserver.BaseServer -> socketserver.TCPServer -> http.HTTPServer
socketserver.BaseServer
1). 实例化需要两个参数
server_address
:
RequestHandlerClass
:
2). 启动方法
-
serve_forever(self, poll_interval=0.5)
一直接受请求直到客户端关闭连接
-
handle_request
:处理单个请求
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
方法
2. handler类继承关系一览
BaseRequestHandler -> StreamRequestHandler -> socketserver.BaseRequestHandler
socketserver.BaseRequestHandler
图片.png基类,实例化后会立即调用handle()
和finish()
方法。
StreamRequestHandler
继承了socketserver.BaseRequestHandler
图片.pngBaseHTTPRequestHandler
继承了StreamRequestHandler
图片.pngWSGIRequestHandler
继承了BaseHTTPRequestHandle
图片.png3. 程序入口
调用 handle_request()
将会启动服务,处理完一条请求后会关闭。
调用 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()
方法。