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

2023-10-29

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

本期内容

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的前端基础框架,以及和后台基础模块交互的API,都封装在了addons下的web模块。

Controller控制器

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

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

图片

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

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

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

图片

http.route

图片

Dispatcher分发模块

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

图片

# Root

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

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

图片

# 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"。

图片

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

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

图片

图片

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

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

图片

# 调用Request的Dispatch方法:

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

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

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

图片

图片

图片

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

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

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

具体对比如下:

图片

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

Odoo框架源码解读干货

用心奉上,欢迎交流~

你有更好思路或疑问

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

# Odoo丨Odoo框架源码研读一:前后端交互 的相关文章

  • 如何为 PyYAML 编写代表程序?

    我想要一个自定义函数来序列化任意 python 对象 就像 json dump 函数有一个名为 default 的可选参数 如果对象不是 json 可序列化的 它应该是 json 转储器将调用的函数 我只是想从 json 包中执行相当于此操
  • python osmnx - 仅提取一个国家的大型高速公路

    我知道可以通过 OSMNX python 包提取城市的道路网络 详情请参阅https geoffboeing com 2016 11 osmnx python street networks https geoffboeing com 20
  • 如何在我的 GUI 上绘图

    我正在设计一个 GUIPyQt当我单击一个按钮来绘制我创建的函数的数据图时 我需要显示一个 matplotlib pylab 窗口 它就像 Matlab 中使用的运行时 每次按下该按钮时 我都想将 matplotlib pylab 窗口保留
  • 在Python中将月份和年份的列合并为季度和年份的列

    我有一个数据框 df Month 1 8 Year 2015 2020 df pd DataFrame data df df 想要将其转变为新列 期望的输出 df Month 1 8 Year 2015 2020 Quarter Q1201
  • 如何在Python中将N毫秒添加到日期时间

    我正在设置一个日期时间变量 fulldate datetime datetime strptime date time Y m d H M S f 其中日期和时间是适合日期时间性质的字符串 如何将此日期时间增加 N 毫秒 Use timed
  • JQuery mouseover 函数多次触发

    我很长时间以来一直使用这种方法来为整个类 按钮等 设置事件 div bigButton mouseover function this style backgroundColor dfdfdf 然而 在进行一些测试时 我刚刚注意到 当将鼠标
  • 使用 SQLAlchemy 查询 Pandas DataFrame 时重命名列

    当您将数据查询到 pandas 数据帧时 有没有办法保留 SqlAlchemy 属性名称 这是我的数据库的简单映射 对于 school 表 我将数据库名称 SchoolDistrict 重命名为较短的 district 我从 DBA 中删除
  • 在 ReactJS 中更改 URL onClick

    在我的项目中我有一个TabComponent它显示 3 个选项卡 首页 热门 全部 现在 我正在使用context反应维持 activetab它存储当前选项卡 toggleTab改变的方法activetab using setState 选
  • 如何循环遍历列表中除最后一项之外的所有项? [复制]

    这个问题在这里已经有答案了 Using a for循环 如何循环遍历列表中除最后一项之外的所有项 我想遍历一个列表 检查每个项目与后面的项目 我可以在不使用索引的情况下做到这一点吗 for x in y 1 If y是一个生成器 那么上面的
  • 从数组中删除空字符串,同时保持记录而不循环?

    这个问题在这里被问到 从数组中删除空字符串 同时保留非空字符串的索引记录 https stackoverflow com questions 18113243 remove empty strings from array while ke
  • 脚本不会从nodejs应用程序中的ejs文件运行

    我正在尝试使用nodejs express mysql和ejs让网页显示图表 但我显然不明白ejs javascript等是如何工作的 我需要运行一个脚本来设置图表 来自 Chart js 模块 但它不会输出任何类型的图表 我尝试过的 将
  • 如何使用javascript将数据存储在xml文件中?

    我是 javascript 新手 并在我的项目中使用它 因为我需要读取 xml 文件 然后在操作后我想将更新后的值存储回 xml 文件中 我成功从 xml 文件获取值 但无法存储值返回到 xml 文件 这是我尝试过的代码
  • 在 JavaScript/CoffeeScript 中确定一个数组是否包含另一个数组的内容

    在 JavaScript 中 如何测试一个数组是否包含另一个数组的元素 arr1 1 2 3 4 5 8 1 10 2 3 4 5 9 function name arr1 gt true 没有 set 函数可以执行此操作 但您可以简单地执
  • 如何使用 opencv python 根据检测到的物体的位置生成其热图

    我需要根据对象的位置生成其热图 示例 视频帧中检测到的绿色球 如果它长时间停留在某个位置 那么该位置应该是红色的 并且球在短时间内经过的帧中的位置必须是蓝色的 这样我就需要生成热图 提前致谢 那么你在这里可以做的是 1 首先定义一个热图作为
  • 如何让 Python 生成器返回 None 而不是 StopIteration?

    我使用生成器在列表中执行搜索 如下简单示例 gt gt gt a 1 2 3 4 gt gt gt i for i v in enumerate a if v 4 next 3 只是为了稍微说明一下示例 与上面的列表相比 我使用的列表要长得
  • 汇总异常以保留模块

    我使用一个名为的汇总插件rollup plugin lit css转变 css文件转换成 javascript 模块 该插件非常简单 它本质上只是附加export default到文件 我的汇总配置使用preserveModules and
  • React cloneElement 未设置键

    我正在构建一个动态生成键的表控件 我理解这可能不是一个好主意 我想键应该与其代表的数据唯一关联 否则 React 只能为我们生成唯一的 id 但无论哪种方式似乎没有设置按键 我不知道为什么 表中的行是用可以找到的函数生成的here http
  • 如何拦截javascript中innerHTML的变化?

    我需要拦截网页内单元格内容的任何更改 以下代码显示 addEventListener 不起作用 function modifyText alert var el document getElementById mycell el inner
  • Promise链基本问题

    我正在尝试理解 Promise 我创建了一些有效的承诺链 而另一些则无效 我已经取得了进步 但显然缺乏基本概念 例如 以下承诺链不起作用 这是一个愚蠢的例子 但说明了问题 我正在尝试在链中使用 Node 的函数 randomBytes 两次
  • 定义Python类时,如何在其中设置随机变量?

    假设我有一个名为Person 其中只有该人的姓名和性别 性别应从男性和女性中随机选择 为此 我导入random randint 功能 根据随机int确定随机性别 import random class Person alias random

随机推荐

  • Intel(R) CFL Mobile/DeskTop Gra显卡驱动

    Intel R CFL Mobile DeskTop Gra这款显卡的驱动不好找 无论是百度还是谷歌 都找不到对应型号的显卡驱动 我找到一个igfx win10 100 9466 exe 可以支持Intel R CFL Mobile Des
  • 大数据技术中的伦理问题

    前言 从2012年开始 大数据 big data 一词越来越多地被提及 人们用它来描述和定义信息爆炸时代产生的海量数据 并命名与之相关的技术发展与创新 在现今的社会 大数据的应用越来越彰显他的优势 它占领的领域也越来越大 电子商务 O2O
  • 华为OD机试 Python 最大价值的矿堆

    题目 背景 你面前有一张地图 上面标有金矿 银矿和空地 这里的规则很简单 金矿值2分 银矿值1分 矿堆是由上下左右相邻的金矿或银矿组成的 现在的任务是 找出地图上价值最高的矿堆 并告诉我们它的总价值 地图说明 0 表示空地 1 表示银矿 2
  • 100天精通Python(进阶篇)——第39天:操作MySQL和SqlServer(pymysql、pymssql基础+代码实战)

    文章目录 一 安装第三方模块 二 pymysql模块使用说明 1 操作流程流程 2 导入pymysql模块 3 创建连接对象 4 获取游标对象 5 获取一条数据 6 获取多条数据 7 对数据增删改操作 三 pymssql模块使用说明 一 安
  • 用python来做regression 图

    我们直接上代码了 之前已经介绍了如何导入表格了 现在就用表格中的数据来进行画图 还是用之前的表格 import pandas as pd import matplotlib pyplot as plt data pd read csv 1
  • ChatGPT如何应用于代码注释和文档自动生成?

    作为一名Java高级软件开发专家 我们在平时的工作中经常会遇到需要撰写代码注释和文档的情况 为了提高编码效率和代码质量 越来越多的开发人员开始探索使用自然语言处理技术 如ChatGPT 来自动生成代码注释和文档 本文将介绍如何将ChatGP
  • x轴z轴代表的方向图片_数控机床的X,Y,Z轴分别指什么方向的运动

    展开全部 标准坐标系的规定 标准坐标系是一个直角坐标系 如图所示 按右手e69da5e887aa3231313335323631343130323136353331333366303836直角坐标系规定 右手的拇指 食指和中指分别代表X Y
  • 关于Ionic2\Angular2使用http的一些坑

    1 服务器接收key value key value类型的值 但服务器无法获取到Post请求的body的值 描述 使用url key value key value的形式可以正常请求到参数 但是把参数放入到body后 服务器估计获取到信息但
  • Kotlin项目类找不到bug:java.lang.ClassNotFoundException: kotlin.reflect.Kotlin Reflect Internal Error

    一 今天在创建了一个Kotlin Spring的项目 结果启动报错 org springframework context ApplicationContextException Unable to start web server nes
  • Python - selenium自动化-Chrome(wap模式)

    Selenium Chrome浏览器如何模拟手机操作 进入手机模式 打开谷歌浏览器 按F12 进入开发者模式 点击Toggle device toolbar 进入手机模式 设置Chrome的手机模式 deviceName可更改成Chrome
  • 人工智能 机器学习实验总结

    答案仅供参考 1 数据预处理 给定数据集datingTest 实验任务 读取DatingTest的数据文件 1 并输出第一列数据的最大 最小和均值 2 输出该文件有多少数据 3 计算第一条数据和第二条数据的欧式距离 import panda
  • 面试题 v-if跟v-show的区别

    v if v show 区别 展示形式不同 v if是 创建一个dom节点 V show 是 display none block 使用场景不同 初次加载 v if 要 比v show 好 页面不会做加载盒子 频繁切换 v show 要比
  • JDK8新特性(七)之Stream流的count()、filter()、limit()、skip()方法

    1 Stream流的count 方法 Stream流提供count方法来统计其中的元素格式 long count 该方法返回一个long值代表元素个数 基本使用 import java util ArrayList import java
  • cmake

    cmake的常用命令 cmake minimum required message project set add executable add compile options add subdirectory add library ta
  • python -- 替换netcdf文件中的时间

    最近 在处理nc文件时 在时间上存在部分缺失的数据 为了避免影响后续操作 这里通过复制前一时刻的nc数据进行替代 但是虽然缺失时刻的数据得到了填充 但是填充的数据的时间属性本质上仍然是前一时刻的 为了保证时间的一致性 这里通过一个更新时间的
  • ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)

    参考 Linux之ARM IMX6U 裸机C语言蜂鸣器驱动实验 驱动编写 编译 作者 一只青木呀 发布时间 2020 08 16 14 47 23 网址 https blog csdn net weixin 45309916 article
  • android adb常用指令

    Android 调试桥 adb 是多种用途的工具 该工具可以帮助你你管理设备或模拟器 的状态 可以通过下列几种方法加入adb 在设备上运行shell命令 通过端口转发来管理模拟器或设备 从模拟器或设备上拷贝来或拷贝走文件 下面对adb进行了
  • C++数组的正确释放方式

    include
  • mariadb日志报错:error while loading shared libraries: libjemalloc.so.2处理办法

    Linux下找不到so文件的解决办法 rznice 2016 03 11 16 39 27 19494 收藏 1 分类专栏 linux 版权 最近在安装完tengine 在启动tengine时报找不到libjemalloc so 2的提示
  • # Odoo丨Odoo框架源码研读一:前后端交互

    Odoo丨Odoo框架源码研读一 前后端交互 本期内容 Odoo框架源码研读之 前后端交互 Odoo框架是一款企业应用快速开发平台 适用于各种规模的企业应用 安装与使用十分广泛 Odoo框架源码的第一篇研读内容 前后端交互 源码文件结构 O