Day 5 - 编写Web框架

    在正式开始Web开发前,我们需要编写一个Web框架。

    aiohttp 已经是一个Web框架了,为什么我们还需要自己封装一个?

    原因是从使用者的角度来说, aiohttp 相对比较底层,编写一个URL的处理函数需要这么几步:

    第一步,编写一个用 @asyncio.coroutine 装饰的函数:

    @asyncio.coroutine

    def handle_url_xxx(request):

    pass

    第二步,传入的参数需要自己从 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'))

    这些重复的工作可以由框架完成。例如,处理带参数的URL blog{id} 可以这么写:

    @get('blog{id}')

    def get_blog(id):

    pass

    处理 query_string 参数可以通过关键字参数 **kw 或者命名关键字参数接收:

    @get('apicomments')

    def api_comments(*, page='1'):

    pass

    对于函数的返回值,不一定是 web.Response 对象,可以是 str bytes dict

    如果希望渲染模板,我们可以这么返回一个 dict

    return {

    'template': 'index.html',

    'data': '…'

    }

    因此,Web框架的设计是完全从使用者出发,目的是让使用者编写尽可能少的代码。

    编写简单的函数而非引入 request web.Response 还有一个额外的好处,就是可以单独测试,否则,需要模拟一个 request 才能测试。