美文网首页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