1 pecan库原理 Pecan是一个路由对象分发的python web框架。 本质上可以将url通过分割为每一部分,然后对每一部分查找对应处理该URL部分的处理类, 处理后,继续交给后面部分的URL处理,直到所有URL部分都被处理后, 调用最后分割的URL对应的处理函数处理。
2 pecan逻辑处理流程 2.1 当一个请求从wsgiserver转发过来,首先处理的是Pecan中的__call__方法 主要调用了find_controller和invoke_controller方法。find_controller根据对象分发机制找到url的处理方法,如果没找到,则抛出异常,由后面的except代码块处理,找到了就调用invoke_controller执行该处理方法,将处理结果保存到state中。
2.2 find_controller方法中主要调用了route方法 route(req, self.root, path): req:WebOb的Request对象,存储了请求的信息 self.root:是第一个处理对象(config.py中定义的root对象) path:路径信息,如:/v1/books
2.3 route方法中调用了lookup_controller方法对截取后的路径进行继续处理 lookup_controller针对每一个controller对象,在其中查找对应的处理方法, 如果没找到,则会继续找_default,如果没定义_default, 则找_lookup,然后继续循环调用lookup_controller,直到找到对应的方法,或notfound_handlers 为空抛出异常
2.4 lookup_controller方法中调用find_object方法 obj, remainder = find_object(obj, remainder, notfound_handlers, request)具体查找: obj:当前的controller对象 remainder:路由信息,如[‘v1’, ‘books’] notfound_handlers:该controller中没找到时,存储_default或者_lookup request:请求信息
2.5 find_object方法 find_object 首先会处理自定义的路由信息,然后存储_default和_lookup,最后处理默认路由 routing.py中的lookup_controller 和 find_object是核心路由方式的实现,从代码中可以看出,最终找到处理方法的方式是根据路径(/v1/books)中每一个segment来查找对应的对象,然后根据当前对象再查找下一个对象,所以pecan的路由机制叫做对象分发
3 expose方法 标识了这个被装饰的方法可以被路由找到 在routing.py中find_object方法会返回找到的subcontroller,它是有@expose装饰的一个方法
4 总结 pecan库首先根据配置文件中配置的主入口Controller类获取到请求, 然后对url分割,查找对应的Controller对象,经过处理后,根据default或者lookup方法 把除了当前路径外剩余的路径给当前Controller下一个处理的Controller对象处理,直到所有URL都被处理。
参考: https://blog.csdn.net/qq527631128/article/details/90245555 https://blog.csdn.net/qq527631128/article/details/90426673 https://blog.csdn.net/qq527631128/article/details/91478794
