flask一次客户端请求的过程

按照Werkzeug的示例,继承封装了标准库http中的HTTPServer和BaseHTTPRequestHandler。在客户端发出请求后,会触发到Handler类中的handle()方法,然后是一连串的handle_one_request()-->run_wsgi()方法,run_wsgi在werkzeug中重写了会收集环境信息environ,并定义了write,start_response,execute内置方法,然后会执行execute方法,这里app(environ, start_response),app即flask的app实例,会先触发中间件的__call__()方法,然后调用flask的__call__(),call方法中默认是直接调用wsgi_app(environ, start_response)。所以flask中即在wsgi_app(environ, start_response)中完成WSGI的标准接口的应用实现。 wsgi_app中每一行都是对响应处理的一步步创建和加工。

with self.request_context(environ):
    rv = self.preprocess_request()
    if rv is None:
        rv = self.dispatch_request()
    response = self.make_response(rv)
    response = self.process_response(response)
    return response(environ, start_response)

with self.request_context(environ): 通过创建_RequestContext的实例,并在__enter__中将这个实例压入_request_ctx_stack全局栈。 preprocess_request算是前处理过程,通过@before_request修饰的方法在此进行处理 dispatch_request是处理请求的正式方法,根据初始化时处理的路由MAP,根据请求的URL找到对应的view中定义的对应的响应方法对请求进行处理view_functionsendpoint,view_function[endpoint]就是那个对应的view中的方法。 make_response对view中方法的返回值进行处理,讲返回结果转换为response对象response_class类型的实例 process_response是和preprocess_request对应的后处理方法,默认提供了session的处理,之后是通过@after_request修饰的方法在这里执行 最后返回response flask的处理结束,然后又回到了werkzeug中,返回内容通过wfile.write(),发送回给客户端。

Show Comments