httpd=WSGServer(addr,WSGIRequestHandler,ip)
#WSGServer继承自simple_server.WSGIServer(初始化ip)继承自HTTPServer继承SocketServer.TCPServer(建立了socket通信)继承BaseServer(初始化self.RequestHandlerClass)
httpd.set_app(wsgi_handler)#simple_server.WSGIServer设置app为wsgi里WSGIHandler()
httpd.serve_forever()#BaseServer使用select.select无限循环接受请求
接受到的请求最终交给RequestHandlerClass,RequestHandlerClass就是WSGIRequestHandler
self.RequestHandlerClass(request, client_address, self)self表示WSGServer的实例
WSGIRequestHandler(request, client_address, self)
WSGIRequestHandler继承自simple_server.WSGIRequestHandler继承自BaseHTTPRequestHandler继承自SocketServer.StreamRequestHandler继承自BaseRequestHandler最终代码
def __init__(self, request, client_address, server):
self.request = request
self.client_address = client_address
self.server = server#WSGServer
self.setup()
try:
self.handle()
finally:
self.finish()
self.handle()代码是
def handle(self):
"""Copy of WSGIRequestHandler, but with different ServerHandler"""
self.raw_requestline = self.rfile.readline(65537)
if len(self.raw_requestline) > 65536:
self.requestline = ''
self.request_version = ''
self.command = ''
self.send_error(414)
return
if not self.parse_request(): # An error code has been sent, just exit
return
handler = ServerHandler(
self.rfile, self.wfile, self.get_stderr(), self.get_environ()
)
handler.request_handler = self # backpointer for logging
handler.run(self.server.get_app())
handler.run(self.server.get_app())
代码最终是:
def run(self, application):
"""Invoke the application"""
# Note to self: don't move the close()! Asynchronous servers shouldn't
# call close() from finish_response(), so if you close() anywhere but
# the double-error branch here, you'll break asynchronous servers by
# prematurely closing. Async servers must return from 'run()' without
# closing if there might still be output to iterate over.
try:
self.setup_environ()
self.result = application(self.environ, self.start_response)
self.finish_response()
except:
try:
self.handle_error()
except:
# If we get an error handling an error, just give up already!
self.close()
raise #
self.result = application(self.environ, self.start_response)
self.finish_response()
最终代码为
class WSGIHandler(base.BaseHandler):
request_class = WSGIRequest
def __init__(self, *args, **kwargs):
super(WSGIHandler, self).__init__(*args, **kwargs)
self.load_middleware()
def __call__(self, environ, start_response):#application(self.environ, self.start_response)
set_script_prefix(get_script_name(environ))
signals.request_started.send(sender=self.__class__, environ=environ)
request = self.request_class(environ)
response = self.get_response(request)
response._handler_class = self.__class__
status = '%d %s' % (response.status_code, response.reason_phrase)
response_headers = [(str(k), str(v)) for k, v in response.items()]
for c in response.cookies.values():
response_headers.append((str('Set-Cookie'), str(c.output(header=''))))
start_response(force_str(status), response_headers)
if getattr(response, 'file_to_stream', None) is not None and environ.get('wsgi.file_wrapper'):
response = environ['wsgi.file_wrapper'](response.file_to_stream)
return response
从整个过程可以看出Django的WSGServer继承python的simple_server.WSGIServer来接受请求,然后WSGServer将接受的请求交到WSGIRequestHandler处理,最终又交到python的BaseRequestHandler处理,而BaseRequestHandler的server是自己实现,最后是交给wsgi.py处理。
从中学习到服务器通过select.select方法接受请求。属于非阻塞式io。通信协议是使用的TCP/HTTP.