Extension Service处理HTTP Request的基本流程

48 篇文章 11 订阅
class ExtensionMiddleware是Extension Service的WSGI Application class,它的类图如下图所示。
一个符合WSGI Application规范的class,最重要的一点是实现回调函数__call__.从这个类图中,可以看到,class ExtensionMiddleware重载了它的父类的__call__函数,所以它的父类基本没什么作用。class ExtensionMiddleware的__call__函数代码如下:
class ExtensionMiddleware(base.ConfigurableMiddleware):
    @webob.dec.wsgify(RequestClass=wsgi.Request)
    def __call__(self, req):
        #这里的application就是前文说的class APIRouter的实例对象
        req.environ['extended.app'] = self.application
        #跟Core Service一样,返回一个RouteMiddleware对象
        return self._router
而self._router是在class ExtensionMiddleware的 __init__函数构建的:
class ExtensionMiddleware(base.ConfigurableMiddleware):
    def __init__(self, application,
                 ext_mgr=None):
        #这句代码与Core Service一模一样
        self._router = routes.middleware.RoutesMiddleware(self._dispatch,mapper)
RoutesMiddleware最终会调用ExtensionMiddleware的_dispatch,代码如下:
    def _dispatch(req):
        match = req.environ['wsgiorg.routing_args'][1]
        #重点在这里,如果没找到,则return req.environ['extended.app']
        # req.environ['extended.app']就是Core Service的WSGI Application,就是class APIRouter的实例对象
        if not match:
            return req.environ['extended.app']
        app = match['controller']
        return app
可以看到,这个函数与class Router(class APIRouter的父类)的_dispatch相比,除了if not match:那两行,基本一模一样。正是这两行,说明了以下两个问题:
1 Core Service与Extension Service,不是并列的Service,而是嵌套关系,如下图:
2 app_ext是app_v2.0的外层filter,也就是说,一个Request得首先到达app_ext,app_ext经过相应的处理,才会交由app_v2.0,这个相应的处理就是if not match:那两行的作用。
因此,Extension Service处理HTTP Request的基本流程,如果不考虑“跳转”这个分支,那形式上与Core Service是一样的,流程图如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值