Odoo web 机制浅析

odoo12新版发布,请看我们最新介绍文档,资料大全与行业方案

  1. 在odoo的基础上,我们可以实现什么功能-基于odoo12企业版的功能列表
  2. odoo 12企业版与免费社区版的区别,价格策略与技术支持指南的全面解析
  3. Odoo12新特性-供应链篇
  4. 使用odoo12进行食品生鲜生产及供应链管理
  5. 使用odoo实现制造业生产成本核算,产销一体化在陶瓷建材的行业应用
  6. odoo 家具行业精益制造方案ERP 全屋定制,拆单拆图,经销商下单管理
  7. odoo商贸行业-供应链进销存需求说明文档模板 
  8. odoo 12实现制造生产的领料-制造-入库-打印各种单据 
  9. Odoo 12中物联网盒子iot box的使用,如何用树莓派DIY实现并连接扫码枪,照相机,电子秤,外显等(pos box, iot box) 
  10. odoo12中OCR使用体验,可用于账单扫描与报销发票单据扫描
  11. Odoo 12 New Features, enhance and boost from 11。 新特性,功能更多,性能更好
  12. 一键安装最新odoo 12/11社区版企业版+ postgresql10 +nginx在ubuntu上的脚本,阿里云测试通过
  13. odoo 开发技术栈,成为高级odoo开发人员的基本技能要求,开发框架
  14. odoo12在线用户使用手册
  15. odoo12在线开发者手册

Odoo作为开源ERP,在欧洲有着广泛的应用,但就中国来说,基本上还处于起步阶段,国内的应用并不是太多,因此,从市场来看,其应用潜力是巨大的。要基于Odoo进行二次开发,就必须要对Odoo的web基本运行原理有必要的了解,才能从宏观上对Odoo有个大体认识。此文正是基于此目的,进行简要的分析,希望能够对开发Odoo应用有帮助。
Odoo使用的编程语言为Python,python本身并不能直接处理web请求,就好比Java并不能直接处理web请求一样,都需要一个媒介或桥梁,那么 要使基于python的Odoo能够处理来自WebServer包装之后的请求,这个媒介或桥梁是什么呢? 这个桥梁就是WSGI. 那么到底什么是WSGI呢?

1 WSGI

WSGI的官方定义:the Python WebServer Gateway Interface。顾名思义,这就是一个Gateway,也就是网关,具体标准请参看 http://legacy.python.org/dev/peps/pep-0333/

(注:以下内容摘自文章【1】)

网关的作用就是在协议之间进行转换,如下图所示

1 WSGI1 WSGI

WSGI一边连着web服务器,另一边连着用户的应用。但是,这个桥的功能很弱,有时候还需要别的桥来帮忙才能进行处理,如下图所示:

1 WSGI1 WSGI

在上图中:

wsgiapp又称应用 ,就是一个WSGIapplication。

wsgi Container ,又称容器 ,虽然这个部分常常被称为handler,handler容易和app混淆,所以称之为容器。

wsgi_middleware ,又称中间件,一种特殊类型的程序,专门负责在容器和应用进行额外处理的

具体wsgi app、wsgi container 和wsgi middleware关系的详细介绍请参看文章【1】

2 Odoo中的web运行机制

2.1 Odoo中的web server

Odoo自身定义实现了4中类型的web server,可以从server.py文件中得知

1 WSGI1 WSGI1 WSGI

1 WSGI

CommonServer是其他三个server的父类

1 WSGI

1 WSGI

Odoo运行的时候默认选择ThreadedServer作为其标准web server

2.2 Odoo中的web container

Odoo 中的web container在wsgi_server.py中定义

1 WSGI1 WSGI

入口函数即为:

def application(environ, start_response)

通过判断在openerp-server.conf中是否定义代理模式proxy_mode和头信息“HTTP_X_FORWARDED_HOST”来判断是否代理请求,从而进行相应的处理

2.3 Odoo中的webhandler

在Odoo中,既然存在odoocontainer,那么必然存在用来处理具体request的handler,这个hander可以理解为容器中的一个具体的servelt

odoo的handler定义在http.py文件

1 WSGI1 WSGI

在运行的时候,通过调用odoo container的register_wsgi_handler方法将HandlerRoot注册到容器中,如下代码所示:

1 WSGI

这个handler实现是充分利用werkzeug包进行二次封装,常见对象有reponse和request。具体werkzeug的内容请参见 http://werkzeug.pocoo.org/

2.3.1 Handler请求分发

1 对于Http请求

既然可以把handler当做java中的servlet,且Odoo中只有Root这样一个handler,那么可以推定Root必然要负责对所有外部来的请求进行分发处理,通过url映射到具体的controller中来进行处理,执行这个操作的就是Root类的dispatch函数   1 WSGI

1 WSGI

2 对于Http  XML-RPC请求

则由http.py中的dispatch_rpc函数进行处理

1 WSGI1 WSGI

2.3.2 Session的处理

Session对于web应用来说相当重要,在Odooo中,session类为OpenERPSession类,定义在http.py文件中

1 WSGI1 WSGI

  Session什么时候被创建?

在handler类初始化时,创建一个空的session对象,该对象并没有具体的值,如下图所示

1 WSGI

 

当用户第一次登录或者访问系统时,Root类的dispatch方法被调用时被创建

1 WSGI

1 WSGI1 WSGI

Session 保存在什么地方?

Odoo中的session不是保存在内存中,而是保存在磁盘中,通过openerp.tools.config.session_dir参数设置保存地址,默认地址是在本地应用数据目录,以我的机子为例,默认的存放地址就是:C:\Users\janusx\AppData\Local\OpenERPS.A.\OpenERP\sessions\8.0

1 WSGI

 

1 WSGI

因此,我们可以通过设置openerp.tools.config.session_dir变量的值来改变odoo session保存的位置,可以是保存在本地或者结合Redis将Session保存到redis

Session 保存的时间是多少?

Odoo对于session的保存,默认是一周,对于超过一周的session,session_gc函数会将其从文件中移除,如下代码所示:

1 WSGI1 WSGI

因此,我们可以通过自定义这个时间,来延长或者缩短Odoo的session的保存时间

2.4 Odoo web启动流程

通过以上分析,我们可知Odoo的启动流程,如下图所示

1 WSGI1 WSGI

 

新版本包括 odoo12,odoo11也大体是这个模式,由rooter处理指向与相关的操作。

参考:

[1] http://linluxiang.iteye.com/blog/799163

From:

http://blog.csdn.net/M0relia/article/details/39025947

odoo中的QWeb模板引擎