使用空@http.route()重写Odoo控制器的作用及工作流差异咨询
Odoo控制器重写时@http.route()有无的工作流差异
重写Odoo控制器方法时,加不加空@http.route()的核心差异,体现在路由注册、触发路径、权限逻辑这几个关键环节,并不是看起来“都会被调用”就没区别:
路由注册状态
Odoo文档说的“未发布”,是指重写时不加
@http.route()的方法,不会更新Odoo的路由注册表。原来的路由依然绑定父类方法,但如果是内部代码直接调用这个方法(比如其他模块里调用self.xxx_method()),会执行子类的重写逻辑——这就是你看到两种场景都能触发的原因。
加了空@http.route()的话,会强制把子类方法重新注册到路由表,直接覆盖父类的路由映射,不管是HTTP请求还是内部调用,都会走子类的逻辑。HTTP请求的触发区别
- 不加装饰器:用户通过URL访问该路由时,Odoo会调用父类的原始方法,而非你重写的子类方法——除非父类方法里有调用子类逻辑的处理(比如用了
super的反向调用)。但内部代码直接调用时,会执行子类重写版本。 - 加了空装饰器:不管是用户通过URL访问,还是内部代码调用,都会执行你重写的子类方法,因为路由表已经把这个路由指向子类了。
- 不加装饰器:用户通过URL访问该路由时,Odoo会调用父类的原始方法,而非你重写的子类方法——除非父类方法里有调用子类逻辑的处理(比如用了
权限与参数继承
空@http.route()会自动继承父类路由的所有参数(比如auth权限、methods请求方式、csrf校验等),如果要修改这些参数,直接在装饰器里指定就行(比如@http.route(auth='public'))。不加装饰器的话,子类方法不会继承路由的权限配置,内部调用时的权限由当前上下文决定,和路由规则无关。调试维护的差异
不加装饰器的重写方法,在Odoo的路由列表(比如/web/tests/route_map)里不会显示为生效路由,排查问题时容易搞混哪个方法在生效;加了空装饰器的方法,会在路由列表里显示为替换后的路由,调试起来更清晰。
内容的提问来源于stack exchange,提问作者Yassir Irfan
相关产品推荐
相关产品推荐

