def run(addr, port, wsgi_handler, ipv6=False, threading=False, server_cls=WSGIServer):
server_address = (addr, port)
if threading:
httpd_cls = type('WSGIServer', (socketserver.ThreadingMixIn, server_cls), {})
else:
httpd_cls = server_cls
上一张最后的run函数,其默认使用的是 WSGIServer类。
class WSGIServer(simple_server.WSGIServer):
class WSGIServer(HTTPServer):
class HTTPServer(socketserver.TCPServer):
class TCPServer(BaseServer):
class BaseServer:
TCPServer是由python自身提供的http服务器,之前聊到Uvicorn
时也是使用的,AsyncIO自带的异步TCP服务器。
逻辑比较复杂,层层嵌套,但最终核心只有一句。
def finish_request(self, request, client_address):
"""Finish one request by instantiating RequestHandlerClass."""
self.RequestHandlerClass(request, client_address, self)
self是WSGIServer实例本身,reqeust是一个socket实例,client_address是socket的端口地址。
而这个**RequestHandlerClass **,让我们再次跳回到run函数
def run(addr, port, wsgi_handler, ipv6=False, threading=False, server_cls=WSGIServer):
......
httpd = httpd_cls(server_address, WSGIRequestHandler, ipv6=ipv6)
但注意,这个WSGIRequestHandler并不是一个对象,而是一个类。也就是说,每次请求相当于都新建一个Handler的实例。这和FastAPI中所采用的方式不同。
class BaseHandler:
......
def _get_response(self, request):
"""
Resolve and call the view, then apply view, exception, and
template_response middleware. This method is everything that happens
inside the request/response middleware.
"""
response = None
......
resolver_match = resolver.resolve(request.path_info)
callback, callback_args, callback_kwargs = resolver_match
......
for middleware_method in self._view_middleware:
response = middleware_method(request, callback, callback_args, callback_kwargs)
if response:
break
if response is None:
wrapped_callback = self.make_view_atomic(callback)
try:
response = wrapped_callback(request, *callback_args, **callback_kwargs)
except Exception as e:
......
......
try:
response = response.render()
except Exception as e:
......
return response
经过接收报文,解析报文,最终request到达这里。进行中间件,通过路由寻找endpoint,使用endpoint来处理。最后得到response返回。
网友评论