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