对于Core Service的WSGI Application而言,一个HTTP Request过来以后,基本的处理流程是在父类class Router中完成的。class Router处理到最后,是从它的成员变量map中查找到对应的处理函数并执行它。mapper本质上是class Router的成员变量。
app=mapper[‘controller’]
class Router的成员变量map是在子类class APIRouter中完成构建。class APIRouter一共两个函数,一个是factory,另外一个就是__init__函数。
APIRouter的__init__函数,完成三件事情:
1 初始化map这个成员变量。
2 加载了ML2 Plugin。
3 实例化了Core Service的Extensoin Manager。
在此只介绍map的初始化。APIRouter的__init__函数与map初始化相关的代码如下:
class APIRouter(base_wsgi.Router):
def __init__(self, **local_config):
#创建mapper这个对象
mapper = routes_mapper.Mapper()
#给mapper这个对象赋值
mapper.connect('index', '/', controller=Index(RESOURCES))
#其他初始化
for resource in RESOURCES:
_map_resource(RESOURCES[resource], resource,
attributes.RESOURCE_ATTRIBUTE_MAP.get(
RESOURCES[resource], dict()))
resource_registry.register_resource_by_name(resource)
#调用父类的__init__函数,将mapper赋值给成员变量map
super(APIRouter, self).__init__(mapper)
def __init__(self, mapper):
#将mapper赋值给成员变量map
self.map = mapper
以上代码,完成了class APIRouter成员变量map的创建和赋值。map的数据结构是routes_mapper.Mapper。关于它的赋值,Neutron写了一段非常复杂的代码,上述代码中,只举了一个例子:
mapper.connect('index', '/', controller=Index(RESOURCES))
这句话非常重要,它虽然只是routes_mapper.Mapper这个class的一个基本用法,却是了解基本原理的一把金钥匙。