奥多。在 werkzeug 中动态注入 url

Odoo. Dynamically inject url in werkzeug

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 为 werkzeug 存储 RouteMap 的位置。

我也试过以如下方式向控制器添加修饰方法:

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

Odoo 9 路由的参考文档是 here,以防万一。

Odoo 计算网络路由并将其存储在 routing_map(计算 here in 8.0, and there in 9.0)中。 该地图通过 routing_map() 方法 (8.0, 9.0) 延迟计算并暴露给 ir.http 模型中的扩展模块。 ir.http._find_handler() 方法在请求处理期间被 ir.http._dispatch() 调用,以在 routing_map.

中定位匹配的路由

您可以 override/extend 实现您自己的动态路由,类似于 web 模块的方式。


后备路由: 动态处理与现有 "static" 规则不匹配的请求的一个有趣的替代方法是 ir.http_handle_exception() method。每当请求处理阶段发生异常时都会调用它,包括未找到匹配路由时。它 returns 的任何内容都将用作响应。

web 模块将其扩展为: