Odoo中如何正确继承自定义模块的Controller控制器?
Odoo12 自定义控制器继承正确实现方案
常见失效原因
你的代码不生效是以下几个问题共同导致的:
- 文件存放位置不符合Odoo规范:控制器文件必须放在模块的
controllers目录下,直接放在模块根目录不会被Odoo扫描加载 - 导入路径错误:目标控制器在第三方模块
moduleWithTheController下,你错误地从自有模块路径导入类 - 模块依赖未配置:没有声明对原控制器所在模块的依赖,加载顺序错误会导致导入失败
- 控制器未注册:新建的控制器文件没有在
__init__.py中声明,Odoo不会执行对应代码
正确实现步骤
1. 调整文件结构
把你的as_read_controller.py移动到自有模块的controllers目录下,最终结构如下:
odoo12_myCustoms/myActualProject/ ├── __init__.py ├── __manifest__.py └── controllers/ ├── __init__.py └── as_read_controller.py
2. 配置模块依赖
打开自有模块的__manifest__.py,把原控制器所在模块加入依赖列表,保证Odoo先加载原模块再加载你的自定义模块:
# __manifest__.py 片段 'depends': [ 'base', 'moduleWithTheController', # 新增原模块依赖 ],
3. 注册控制器文件
在controllers/__init__.py中导入你写的控制器文件:
# controllers/__init__.py from . import as_read_controller
4. 编写继承代码
打开as_read_controller.py,修正导入路径和路由配置,参考如下代码:
from odoo import http # 从原模块对应路径导入目标控制器基类 from moduleWithTheController.controllers.as_controller import as_webservice as BaseWebservice class ExtendedWebservice(BaseWebservice): # 路由路径、auth、type参数必须和原路由完全一致,公共路由建议补充csrf=False避免校验冲突 @http.route( ['/account_fiscal/account', '/account_fiscal/account/<account_id>', '/account_fiscal/account/name/<ai>'], auth="public", type="http", csrf=False, ) def account(self, account_id=None, ai=None, **post): # 若需要保留原逻辑,先调用super执行原方法,再新增自定义逻辑 # base_resp = super().account(account_id=account_id, ai=ai, **post) # 自定义逻辑写在这里 # return base_resp # 若需要完全替换原逻辑,直接编写返回逻辑即可 return "自定义接口返回内容"
5. 生效操作
重启Odoo服务并升级你的自定义模块,让代码生效,执行命令参考:
./odoo-bin -u myActualProject -d 你的业务数据库名
排查要点
如果按上述步骤操作后仍不生效,逐一检查:
- 原模块的内部导入路径是否正确,部分模块会在controllers/init.py中做别名导出,需要对应调整导入语句
- 路由参数是否和原路由完全一致,路径、请求类型、鉴权方式不一致会导致路由注册冲突
- 升级模块时是否指定了正确的数据库,未指定数据库时模块升级不会生效
内容的提问来源于stack exchange,提问作者Oscar Vardela
相关产品推荐
相关产品推荐

