美文网首页Django 源码解读
Django源码阅读 (二) WSGI服务器与Request

Django源码阅读 (二) WSGI服务器与Request

作者: Gascognya | 来源:发表于2020-10-16 11:43 被阅读0次
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的端口地址

debug
而这个**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返回。

相关文章

网友评论

    本文标题:Django源码阅读 (二) WSGI服务器与Request

    本文链接:https://www.haomeiwen.com/subject/foropktx.html