Odoo通过装饰器进行路径定义。这几乎没问题,但是......我们想编写模块,这将允许我们进行动态重写。
https://www.odoo.com/documentation/8.0/reference/http.html - 在这里我们可以找到添加路线的标准方式。
看起来像:
class MyController(openerp.http.Controller):
@route('/some_url', auth='public')
def handler(self):
return stuff()
理想情况下,我们希望找到odoo为RouteMap
存储werkzeug
的位置。
我还试图将装饰方法添加到控制器中,如:
def my_redirect(new_url):
t = lambda x: werkzeug.utils.redirect(new_url, 301)
return t
MyController.test = http.route('/old_url/')(my_redirect('/new_url/'))
但在这种情况下,我们会收到错误here。
答案 0 :(得分:3)
Odoo 9路线的参考文档为here,以防万一。
Odoo在routing_map
(计算here in 8.0和there in 9.0)中计算并存储网络路线。
该地图通过ir.http
方法(8.0,9.0)延迟计算并向routing_map()
模型中的扩展模块公开。 ir.http._find_handler()
方法在请求处理期间由ir.http._dispatch()
调用,以在routing_map
中找到匹配的路由。
您可以覆盖/扩展其中任何一个以实现您自己的动态路由,类似于web
模块的工作方式。
后备路由:动态处理与现有“静态”规则不匹配的请求的一个有趣替代方案是ir.http
的{{3}}。只要在请求处理阶段发生异常(包括未找到匹配的路由),就会调用它。它返回的任何内容都将用作回复。
web
模块将其扩展为:
_handle_exception()
method
有时会使用这种过渡“hack”来映射以前网站的URL。