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/



__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.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到底是做什么用的,没弄清楚。