启动 Odoo 时,各个controller 被引入,此时,会被注册到 Controller 类的属性 children_classes 里面 ;;
备注: odoo 15及之前版本, 注册到 controllers_per_module
客户端访问 Odoo 的时候,是由 Root App 这个 wsgi 应用来响应 http 请求的; 当 http 请求进来的时候, 先选择数据库, 然后通过 ir.http 提供的 _match() 方法来查询 URL 对应的 endpoint; 如果 查到 ,就将 该 http 请求 的处理器 设置为 相应的 endpoint 所包装的 function,并由其 进行处理; 如果没有 找到 URL,则返回 404
备注: ir_http._match() 其实是 方法 route_map() 的包装
route_map() 的核心逻辑是:
- 先找出 当前数据库已经安装的模块
- 调用 http._generate_routing_rules() 获取所已安装模块对应的 controller, 最后汇总 返回 url, endpoint 对
endpoint 就是 controller 里面被 route 装饰过的方法, 在 route_map() 方法里面,用 functools.partial() 包装一下,最终的形式 是这样的。
odoo.addons.web.contrllers.main.DataSet 这个 controller 的 search_read() 方法
备注: 模块都会转化为这个名称 odoo.addons.*