编写Web框架
虽然已经有了aiohttp,但是还是需要封装一个Web框架。
因为aiohttp比较底层,编写一个URL需要几步操作:
但是这些重复的操作可以用框架来完成,我们只需要关注地址以及功能。所以实际上目标是这么写:
下面开始实际编写一下Web框架。
@get和@post
按照上面的要求,先定义 , 与之类似。
定义RequestHandler
URL处理函数不一定是一个coroutine,因此我们用RequestHandler()来封装一个URL处理函数。
RequestHandler是一个类,由于定义了 方法,因此可以将其实例视为函数。
RequestHandler目的就是从URL函数中分析其需要接收的参数,从request中获取必要的参数,调用URL函数,然后把结果转换为web.Response对象,这样,就完全符合aiohttp框架的要求:
还需要一个add_route函数,用来注册URL处理函数:
然后用add_routes函数,自动把handlers模块的所有符合条件的函数注册。
最后在app.py中加入middleware、jinja2模板和自注册的支持:
middleware
middleware是一种拦截器,一个URL在被某个函数处理前,可以经过一系列的middleware的处理。
上面定义的loggerfactory,responsefactory都是拦截器,作用就是把通用的功能从每个URL处理函数中拿出来,集中放到一个地方。
logger_factory是记录日志的logger:
response这个middleware把返回值转换为web.Response对象再返回,以保证满足aiohttp的要求:
总结
这个框架的设计其实跟Android中的Retrofit是类似的设计思路,使用时用@get和@post加路径的方式,调用的功能在后面定义的url函数中。
而middleware比较像okhttp中的interceptor,都是起到拦截器的作用,实际是在访问的过程中,统一进行相同的处理。
不过即使Python中已经有了Flask,Django这样成熟的网络框架,自己写一个也是一种更好的学习方式。
领取专属 10元无门槛券
私享最新 技术干货