最近在做一个项目时,因为有些数据需要提供给其它客户端查询,本来也可以通过xmlrpc来操作,但这样前端写js的人就需要对oe的数据表对象关系非常清楚,为了简化前端调用,我们最终采用的是在服务器端建立一些api接口,由前端通过ajax来调用。

开始在模块中通过http.route建立了一些url接口,服务器已经根据前端需求返回指定的json格式,但在测试时,发现前端调用时,总是返回404的错误,调试、追踪了大半天,最终发现问题是在数据库上面,因为我在oe上建了两个数据库,正常通过浏览器登录时,我们是先选择数据库,选择后oe会检查所选数据库已经安装的模块,并将所有已安装模块中的http.route建立一个映射表,当后面再有url访问时,通过这个映射表来确认调用哪个py方法。

如果没有前面的选择数据库动作,直接通过url访问时,此时oe并不知道你要访问哪个数据库,也无法建立url与py方法的映射,所以直接返回了404的错误。

最终权宜之计是我删除了其它的数据库,只保留了一个数据库,这样oe在启动时,就会直接加载此数据库的url映射,就可以正常访问。

但这样子理解,又有一个问题不明白,如果说数据库多的时候,系统不知道使用哪个数据库中的url映射,那为什么系统自带的一些url又没问题,比如/web/login,当我们使用此url时,oe能正确定位到py方法中,不知道是不是/web开头的url哪里有特殊处理?

这个问题后续再仔细了解。。。

后来查看源码,原来在openerp.conf.server_wide_modules列表中,是有记录预加载的模块的地方,web模块是属于与数据库无关的预加载模块,所以没有选择数据为时,系统也能访问url对应的py方法。这个列表可以在oe服务器运行时,通过--load参数来指定,所以我们自己的模块要在oe启动时就响应url请求,则只要预加载自己的模块即可。