aiohttp是一个较底层的框架,当有HTTP请求进入,aiohttp会生成一个
request
对象,经处理后返回一个
Response
对象。
但是,中间的处理过程需要我们自行去完成,所以我们要
在aiohttp基础上自己封装一个框架
。
1. 编写视图函数(URL处理函数)
1.1 aiohttp编写视图函数
如果仅仅用aiohttp编写视图函数,我们需要以下几步:
第一步,编写一个由
async/await
装饰的函数:
async def handle_url_xxx(request):
...
第二步,传入视图函数的参数要自己从
request
中获取:
url_param = request.match_info['key']
query_params = parse_qs(request.query_string)
第三步,自行构造返回的
Response
对象:
text = render('template', data)
return web.Response(text.encode('utf-8'))
以上这些重复的过程,
可以在新建的框架中封装起来。
1.2 新建框架编写视图函数
首先
编写一个构造视图函数的装饰器
,其中传递、储存URL信息
(path,method)
。
# 建立视图函数装饰器,用来存储、附带URL信息
def Handler_decorator(path, *, method):
def decorator(func):
@functools.wraps(func)
def warpper(*args, **kw):
return func(*args, **kw)
warpper.__route__ = path
warpper.__method__ = method
return warpper
return decorator
# 偏函数。GET POST 方法的路由装饰器
get = functools.partial(Handler_decorator, method = 'GET')
post = functools.partial(Handler_decorator, method = 'POST')
这样就可以
直接通过装饰器,直接将一个函数映射成视图函数。
@get
def View(request):
return response
1.3 编写RequestHandler:处理request对象
我们已经完成了视图函数装饰器的编写,但这远远不够。视图函数仍无法从
request
中获取参数。
所以我们还要从
request
对象中提取相应视图函数所需的参数,并且视图函数并非都是
coroutine
。
因此,
需要定义一个能处理
request
请求的类来对视图函数进行封装,
RequestHandler
。
RequestHandler
是一个类,分析视图函数所需的参数,再从
request
对象中将参数提取,调用视图函数(URL处理函数),并返回
web.Response
对象。
由于其定义了
__call__()
方法,其实例对象可以看作函数。