1、请求到来先执行app.__call__(self, environ, start_response)

 

2、然后执行__call__中的wsgi_app方法

 

3、执行wsgi_app中的request_context方法

 

4、执行wsgi_app中的ctx.push()

 

 5、执行上述push方法中的_request_ctx_stack.push(self)

_request_ctx_stack是一个全局的LocalStack对象

执行LocalStack对象的push方法,将ctx对象添加到Local对象的stack属性对应的列表中

 

 

 6、接着执行ctx对象push方法中的session_interface.open_session(self.app, self.request)

执行SecureCookieSessionInterface对象中的open_session方法,获取session,然后赋值给ctx对象的的session属性

 

7、然后执行wsgi_app方法中self.full_dispatch_request(),执行视图函数

①视图函数中执行request.method

上述request是全局的request,是一个LocalProxy对象

实例化LocalProxy对象将上述偏函数(partial(_lookup_req_object, 'request'))存到对象的__local属性中

 

request.method=LocalProxy对象.method

LocalProxy对象.method将会调用LocalProxy对象中__getattr__(self, name)

 

执行上述self._get_current_object()

 

 

执行偏函数,获取request对象

 

②视图函数中执行session['user'] = 123

上述session是全局的session,是一个LocalProxy对象

实例化LocalProxy对象将上述偏函数(partial(_lookup_req_object, 'session'))存到对象的__local属性中

 

session['user'] = 123将执行LocalProxy对象中的__setitem__方法

 

执行上述self._get_current_object()

 

执行偏函数,获取session对象

 

8、执行full_dispatch_request()中的self.finalize_request方法

然后调用finalize_request方法中的process_response方法,将内存中session数据存入到响应个用户的cookie中

 

9、最后执行wsgi_app方法中的auto_pop方法,将ctx对象从全局的Local对象的列表中移除

 

 

posted on 2018-10-09 19:06  谢林臻  阅读(122)  评论(0)    收藏  举报