20180201

app.router.add_route('GET', '/index', index)


add_route-->add_resource(return resource对象)-->add_route


aiohttp.web_urldispatcher.UrlDispatcher

add_route

add_resource

register_resource

self._resources.append(resource)



resource

self._path = path

add_route

register_route

self._routes.append(route)


ResourceRoute

self._handler = handler

self._method = method

self._resource = resource




2016的网址

http://yeqianfeng.me/aiphttp-handler-of-comming-request/



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
__all__  =  [ 'AbstractEventLoopPolicy' ,
            'AbstractEventLoop' 'AbstractServer' ,
            'Handle' 'TimerHandle' ,
            'get_event_loop_policy' 'set_event_loop_policy' ,
            'get_event_loop' 'set_event_loop' 'new_event_loop' ,
            'get_child_watcher' 'set_child_watcher' ,
            '_set_running_loop' '_get_running_loop' ,
            ]
 
1.ServerHttpProtocol  self .handle_request(message, payload)
2.RequestHandler  类里的 handler_request() 函数
handle_request( self , message, payload)
 
handler_request方法
match_info  =  yield  from  self ._router.resolve(request)
#_router是什么对象类型
handler  =  match_info.handler
handler = yield  from  factory(app, handler)
yield  from  handler(request)
 
match_info  - > self ._route.resolve(request) - >resource.resolve(method, path) - >UrlMappingMatchInfo(match_dict, route) route是什么对象类型
 
这个 match_info 究竟是什么,是怎么获得的,他里面包含了哪些属性?
handler 又是什么,又是怎么获得的?
handler(request) 看起来很像我们的 request 的最终处理函数,它的执行过程究竟是怎样的?
 
app.router.add_route( 'GET' '/index' , index)
class  AbstractRoute(metaclass = abc.ABCMeta)
原来层层 handler 的最终返回的东西是 AbstractRoute 类里的 _handler,可以发现这个 _handler 是在 AbstractRoute 构造函数里给它赋值的,那么这个 AbstractRoute 类型的对象什么时候会实例化呢
route  =  ResourceRoute(method, handler,  self ,expect_handler = expect_handler)
         
super ().__init__(method, handler, expect_handler = expect_handler, resource = resource)
handler 所指向的确实就是我们最终的 url 处理函数
 
我们再回到 handle_request()中看
@asyncio .coroutine
def  handle_request( self , message, payload):
     ......
     handler  =  match_info.handler
     for  factory  in  reversed ( self ._middlewares):
         handler  =  yield  from  factory(app, handler)
     resp  =  yield  from  handler(request)
 
app  =  web.Application(loop = loop, middlewares = [
         data_factory, response_factory, logger_factory])
 
factory(app, handler)(request)
 
 
总结
1.app .router.add_route( 'GET' '/index' , index) 初始化handler函数
 
2. 正确的request请求 handle_request( self , message, payload)
match_info  - > self ._route.resolve(request) - >resource.resolve(method, path) - >UrlMappingMatchInfo(match_dict, route) route是什么对象类型


最新理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1.app .router.add_route( 'GET' '/index' , index)
 
对象plainResource(path,name)
 
对象调用返回值ResourceRoute(method,handler)
 
初始化route,resource
 
 
 
2.request 请求与已经初始化的path路径比对
 
self ._route.resolve(request)  - >
for  resource  in  self ._resources
match_dict, allowed  =  yield  from  resource.resolve(method, path)  self ._resource 中存储的元素是 ResourceRoute 类型的对象
- >match_dict  =  self ._match(path)
for  route  in  self ._routes
return  UrlMappingMatchInfo(match_dict, route), allowed_methods
 
resource  是plainResource 类型对象
 
route 是 ResourceRoute 类型的对象,里面封装了 PlainResource 类型的对象,也就是 resource 对象
 
 
逻辑
1.resource 没有对应的path,就继续循环resource,查找path
 
route和resource到底是做什么用的,没弄清楚。





本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1944792,如需转载请自行联系原作者