截止到上篇文章 学习WSGI框架pecan(四)注册路由方法二
我们已经有了两种方法去注册一个路由,今天我们第三种方法。OpenStack Neutron组件就是用这种方法实现的。
我们这次仍然只更改root.py,其他文件不动
添加新的控制器ITController
这个控制器我们用来处理,所有IT类型的书籍,也就是通过/book/it为前缀访问的
class ITController(object):
@happy_expose
def _default(self, *remainder):
return "All the books here are about IT."
使用_lookup转发路由
我们给BookController增加方法_lookup
@happy_expose
def _lookup(self, *remainder):
if remainder[0] == "it":
return ITController(), remainder[1:]
remainder这是一个数组,是去掉book以后的,我们判断紧接着是it的话我们就处理,不是的话就不管他。这个方法有效的返回是第一个是一个控制器,第二个是一个剩余路由的数组。其他返回无效!
效果查看
访问http://127.0.0.1:500/book/it
我们访问http://127.0.0.1:500/book/it/network 等以/book/it开头的都是这个返回。
我们访问以下httphttp://127.0.0.1:500/book/food
我们看到,返回了BookController的_default的处理结果。那么_default和_lookup的处理顺序是啥呢?下面介绍
结果说明
我们访问/book/it和/book/food Pecan是如何处理的呢?
第一步
我们知道这两个路由以book开头,会交给BookController去处理
第二步
BookController开始处理,查找有没有可用_default方法,加入notfound_handlers,发现有,我们的notfound_handlers=[BookController()._default]
第三步
查找有没有可用的_lookup方法,加入notfound_handlers,发现有,我们的notfound_handlers=[BookController()._default, [BookController()._lookup]
第四步
查找BookController同名的属性处理,发现没有,抛出PecanNotFound
第五步
接收到PecanNotFound查看一下notfound_handlers里有没有对象,发现有。接着处理
第六步
前面也提到过,会从notfound_handlers队尾获取一个处理方法,也就是BookController()._lookup(后入先出)。
处理/book/it,也就是BookController()._lookup(“it”)
处理/book/food,也就是BookController()._lookup(“food”)
当是it时,发现_lookup返回了一个两个元素的数组,校验,符合返回要求,把返回的第一个元素作为Controller继续处理。再从第一步开始走。不再赘述。
当food时,发现_lookup没有返回,不符合返回要求,交给notfound_handlers继续处理。注意:只有_lookup返回不合法时,会继续交给notfound_handlers,如果是_default返回不合法将直接报404!
第七步
当是food时,_lookup没处理成功,发现notfound_handlers,还能pop出处理对象,就接着交给_default处理,所以页面显示“This is Book default”。