首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python项目WebApp实战之四——编写网络框架

编写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这样成熟的网络框架,自己写一个也是一种更好的学习方式。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180418G07A0I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券