python wsgi 详解浏览器请求过程

本文详细介绍了从浏览器输入IP:9000开始,到WSGI服务器处理请求的全过程。涉及到select异步模式、HTTPServer类继承结构以及WSGIRequestHandler的处理步骤。在请求处理中,包括了select监听、线程处理、请求解析、中间件的运用以及响应生成等关键环节。通过对Django中间件的解释,展示了request、view和response的处理流程。
摘要由CSDN通过智能技术生成

由于这两连天一直在看python wsgi解析request以及response的过程,所以先记录django系列博客的第一篇文章,过几天会将wsgi初始化过程写一篇文章。

前提:

(1)本章节采用 再浏览器输入 IP:9000,后服务器的处理请求的具体过程。

(2)wsgi web服务器套接字采用select异步模式,设有select 超时间隔,并且超时后通过while循环继续select。

(3)类的继承关系simple server真正的类是WSGIServer,继承自HTTPServer,HTTPServer类又继承自TCPServer,TCPServer又继承自BaseServer;与server类直接打交道的还有RequestHandler类,从最上层的WSGIRequestHandler —>BaseHTTPRequestHandler —> StreamRequestHandler —> BaseRequestHandler。

处理过程:

1、当客户端请求数据时,会触发select,返回相应的socket,如下图:

                                           

                r, w, e = _eintr_retry(select.select, [self], [], [],
                                       poll_interval)                         
                if self in r:
                    print("s_handle_request_noblock")
                    self._handle_request_noblock()


2、则进入_handle_request_noblock()函数:

1)在函数体内调用 get_request() (内部调用accept,返回客户端连接以及客户端地址):

                                          request, client_address = self.get_request()

2)进入process_request函数,处理请求:

                                          self.process_request(request, client_address)

此函数在ThreadingMixIn类中:                                   

    def process_request(self, request, client_address):
        """Start a new thread to process the request."""
        print("ThreadingMixIn")
        t = threading.Thread(target = self.process_request_thread,
                             args = (request, client_address))
        t.daemon = self.daemon_threads
        t.start()

由此函数可看出,process_resquest函数启动新新线程处理请求,线程函数为process_request_thread。

3)start后进入线程函数,而主线程返回到select处继续监听。process_request_thread线程函数如下:

        try:
            print " process_request_thread"
            self.finish_request(request, client_address)
            self.shutdown_request(request)
        except:
            self.handle_error(request, client_address)
            self.shutdown_request(request)
finish_requesth函数处理具体的请求:
        def finish_request(self, request, client_address):
            """Finish one request by instantiating RequestHandlerClass."""
            print "finish_request",request
            print self.RequestHandlerClass
            self.RequestHandlerClass(request, client_address, self)

此函数通过实例化RequestHandlerClass类来处理具体请求,此类实际为WSGIRequestHandler类,在初始化WSGIServer时传递给变量WSGIServer.RequestHandlerClass的。

3、现在进入RequestHandlerClass的处理流程

1)通过RequestHandlerClass类的继承关系知,调用基类BaseRequestHandler.__init__(self, request, client_address, server)函数初始化,如下:

    def __init__(self, request, client_address, server):
        self.request = request
        self.client_address = client_address
        self.server = server
        print "BaseRequestHandler"
        self.setup()
        try:
            self.handle()
        finally:
            self.finish()
初始化进行了一些必要的赋值操作,记录server等,接着调用self.setup()函数.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值