wsgi

 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值