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,如需转载请自行联系原作者