由于这两连天一直在看python wsgi解析request以及response的过程,所以先记录django系列博客的第一篇文章,过几天会将wsgi初始化过程写一篇文章。
前提:
(1)本章节采用 再浏览器输入 IP:9000,后服务器的处理请求的具体过程。
(2)wsgi web服务器套接字采用select异步模式,设有select 超时间隔,并且超时后通过while循环继续select。
(3)类的继承关系simple server真正的类是WSGIServer,继承自HTTPServer,HTTPServer类又继承自TCPServer,TCPServer又继承自BaseServer;与server类直接打交道的还有RequestHandler类,从最上层的WSGIRequestHandler —>BaseHTTPRequestHandler —> StreamRequestHandler —> BaseRequestHandler。
处理过程:
1、当客户端请求数据时,会触发select,返回相应的socket,如下图:
r, w, e = _eintr_retry(select.select, [self], [], [],
poll_interval)
if self in r:
print("s_handle_request_noblock")
self._handle_request_noblock()
2、则进入_handle_request_noblock()函数:
1)在函数体内调用 get_request() (内部调用accept,返回客户端连接以及客户端地址):
request, client_address = self.get_request()
2)进入process_request函数,处理请求:
self.process_request(request, client_address)
此函数在ThreadingMixIn类中:
def process_request(self, request, client_address):
"""Start a new thread to process the request."""
print("ThreadingMixIn")
t = threading.Thread(target = self.process_request_thread,
args = (request, client_address))
t.daemon = self.daemon_threads
t.start()
由此函数可看出,process_resquest函数启动新新线程处理请求,线程函数为process_request_thread。
3)start后进入线程函数,而主线程返回到select处继续监听。process_request_thread线程函数如下:
try:
print " process_request_thread"
self.finish_request(request, client_address)
self.shutdown_request(request)
except:
self.handle_error(request, client_address)
self.shutdown_request(request)
finish_requesth函数处理具体的请求:
def finish_request(self, request, client_address):
"""Finish one request by instantiating RequestHandlerClass."""
print "finish_request",request
print self.RequestHandlerClass
self.RequestHandlerClass(request, client_address, self)
此函数通过实例化RequestHandlerClass类来处理具体请求,此类实际为WSGIRequestHandler类,在初始化WSGIServer时传递给变量WSGIServer.RequestHandlerClass的。
3、现在进入RequestHandlerClass的处理流程
1)通过RequestHandlerClass类的继承关系知,调用基类BaseRequestHandler.__init__(self, request, client_address, server)函数初始化,如下:
def __init__(self, request, client_address, server):
self.request = request
self.client_address = client_address
self.server = server
print "BaseRequestHandler"
self.setup()
try:
self.handle()
finally:
self.finish()
初始化进行了一些必要的赋值操作,记录server等,接着调用self.setup()函数.