首页 > 编程语言 > Odoo丨Odoo框架源码研读一:前后端交互

Odoo丨Odoo框架源码研读一:前后端交互

时间:2023-02-13 17:35:56浏览次数:42  
标签:请求 -- Controller 源码 Odoo 交互 研读

Odoo框架源码研读之

前后端交互

Odoo框架源码的内容——“前后端交互”。

源码文件结构\

Odoo14.0源码结构:

.
|-- CONTRIBUTING.md
|-- COPYRIGHT
|-- LICENSE
|-- MANIFEST.in
|-- README.md
|-- SECURITY.md
|-- addons
|-- debian
|-- doc
|-- odoo
|-- odoo-bin
|-- requirements.txt
|-- setup
|-- setup.cfg
`-- setup.py
  • doc文件夹下是项目的帮助文档;
  • odoo-bin文件是Odoo的启动脚本,配合自定义的odoo.conf配置文件,用来启动项目;
  • odoo是Odoo的底层模块,包含项目的基础父类,以及项目启动需要的基础类;
  • addons中包含了odoo的基础业务模块,包括CRM、Sales等模块。

框架结构

经历了六个月的Odoo学习与实战,基于笔者对Odoo前后端交互的理解,总结出了下面的框架,供大家参考 ⬇

 Odoo丨Odoo框架源码研读一:前后端交互_数据库

前后端交互\

Odoo的前端基础框架,以及和后台基础模块交互的API,都封装在了addons下的web模块。

Controller控制器

Odoo是通过Controller控制器,来控制前后台的交互。

然后再根据功能的不同,划分成了多个控制器,从下图中每个controller的命名中,可以了解各自对应的功能模块。

 Odoo丨Odoo框架源码研读一:前后端交互_数据库_02

这些Controller继承了Base模块中的Controller基类,并通过http.route装饰器的注解,将Controller中的方法标记为请求处理器,变成对外暴露的API接口,接收并处理http请求。

关于http.route的详细介绍,源码中有详细的注释。

此处以基础业务模块的Controller控制器DataSet查询列表数据接口search_read为例:

 Odoo丨Odoo框架源码研读一:前后端交互_数据库_03

http.route

 Odoo丨Odoo框架源码研读一:前后端交互_封装_04

Dispatcher分发模块

通过调试代码,整理请求在到达Controller之前的处理流程如下:

 Odoo丨Odoo框架源码研读一:前后端交互_封装_05

# Root

Root是Odoo的WSGI根应用,会在项目启动的时候创建。

请求到达Odoo后,会被Root接收,并调用Dispatch方法。

 Odoo丨Odoo框架源码研读一:前后端交互_数据库_06

# Root在Dispatch方法处理流程:

Step1:获取werkzeug中的原始request对象;

Step2:设置上下文环境,包括将状态绑定线程、设置session、数据库、语言等。

Root在设置DB的时候,会根据db_filter配置参数去获取匹配的数据库信息。

如果唯一,那么进入系统登陆页面的时候session中会带有db;

反之进入系统时Session中不会带有DB,并会进入数据库选择页面,选择之后才是登陆页面。

登陆时会把选择的数据库信息设置到Session中,以保证后面的请求,都会通过IrHttp映射器,分映射发请求到对应的方法。

Step3:通过get_request方法,将request对象封装成HttpRequest或者JsonRequest;

Step4:通过判断Session是否带有DB数据库名称,调用不同的分发逻辑。如果DB值为空,就会跳转到选择数据库的界面,否则会调用IrHttp请求映射器进行Dispatch。

# IrHttp

源码中,对IrHttp的描述是"HTTP Routing"或者是"Routing map"。

 Odoo丨Odoo框架源码研读一:前后端交互_数据库_07

请求在到了IrHttp._dispatch()后,做了如下操作:

Step1:根据请求中的path作为key去routeing_map中匹配对应的路由信息(方法、参数等);

 Odoo丨Odoo框架源码研读一:前后端交互_数据库_08

 Odoo丨Odoo框架源码研读一:前后端交互_前后端交互_09

Step2:根据获取到的路由信息中的auth,去进行权限校验;

Step3:根据获取的路由信息以及校验信息,封装requestHandler;

 Odoo丨Odoo框架源码研读一:前后端交互_前后端交互_10

# 调用Request的Dispatch方法:

请求在到了HttpRequest/JsonRequest的Dispatch方法后,都通过父类WebController的__call_function()方法。

根据在IrHttp时,已经封装好的entpoint路由信息,路由到对应的Controller中的接口方法。

除此之外,HttpRequest在call_function之前,还校验了csrf_token,而JsonHttp,则是根据配置打印debug日志,以及返回结果,封装json_response。

 Odoo丨Odoo框架源码研读一:前后端交互_封装_11

 Odoo丨Odoo框架源码研读一:前后端交互_前后端交互_12

 Odoo丨Odoo框架源码研读一:前后端交互_封装_13

至此,请求就顺利的到达了Controller控制器。

关于HttpRequest和JsonRequest,两者都继承了同一个父类WebRequest。可以看出:两者都具有处理异常、分发请求的功能。

相比于JsonRequest,HttpRequest多了是否校验cors、渲染html和处理404请求的功能;而JsonRequest,则多了封装json_response的功能。

具体对比如下:

 Odoo丨Odoo框架源码研读一:前后端交互_数据库_14

关于Odoo架构中前后端交互的内容,本篇就先讲到这里,下一期我们将给大家深入的介绍Odoo的ORM。

Odoo框架源码解读干货

用心奉上,欢迎交流~

你有更好思路或疑问

快来加入社群一起讨论哦⬇

标签:请求,--,Controller,源码,Odoo,交互,研读
From: https://blog.51cto.com/u_15964438/6054531

相关文章