OpenERP 7.0 Web模块开发
-
1)OpenERP Web框架原理
1.1)系统启动
OpenERP系统启动代码见openerp/cli/server.py,系统启动时候,首先检查多核参数(workers),如果是多进程模式(multi_process),则启动多核版(Multicorn)WSGI_Server,否则启动单核版WSGI_Server。如果是单进程模式,系统同时启动netrpc_server和cron线程。多进程模式,则不启动netrpc_server和cron线程,相关代码参见openerp/service/init.py。因此,多进程模式下,基于netrpc的GUI客户端不能用,同时,系统正常运行必不可少的cron作业需要另开进程启动。
1.2)WSGI_Server启动
WSGI_Server启动后,侦听http请求。当收到请求后,轮询handler,如果某handler返回了结果,则返回给客户。如果没有合适的handler响应,则返回404错误页面。
handler分系统handler和模块handler,系统handler是系统启动时候加载的,模块handler是,加载含有handler的模块时候,注册handler到WSGI_Server。系统handler有:wsgi_xmlrpc_1, wsgi_xmlrpc, wsgi_xmlrpc_legacy, wsgi_webdav,他们处理下述路径的web请求:
XML_RPC_PATH = '/openerp/xmlrpc'
XML_RPC_PATH_1 = '/openerp/xmlrpc/1'
JSON_RPC_PATH = '/openerp/jsonrpc'
JSON_RPC_PATH_1 = '/openerp/jsonrpc/1'
相关代码见:wsgi_server.py 的application_unproxied 。
系统目前只有一个模块handler,即addons/web模块提供的handler。该模块加载时,即注册handler。该handler中,收到http请求时候,根据请求的path,查找http_controller,找到controller则调用该controller的方法。
http_controller的原理是,OpenERP系统将addons下含有static目录的模块当成http_controller。系统加载该模块时候,自动将模块中的继承自web.http.Controller的class当作http_controller。每个http_controller有属性_cp_path,表明该controller处理_cp_path下的请求。系统根据请求路径比对_cp_path,找到相应controller,调用controller的method响应请求。请求路径中最后一个/之后的内容,系统默认为是controller的method名。上述相关代码见:openerp/addons/web/http.py 。
2)Web模块开发
OpenERP web模块很简单,只要在普通模块中,a)增加目录static,其中通常存放静态网页内容,包括js,img,xml模板等。b)通常增加一个controllers目录(不是必须的),里面放py的http_controller代码。每个controller都必须继承自openerp.addons.web.http.Controller,并且必须有属性_cp_path 。controller中的每个method相应一种http请求。