2016-02-17 36 views
2

Odoo有通过装饰器定义路由的方法。这几乎没问题,但是..我们想写模块,这将允许我们进行动态重写。Odoo。在werkzeug中动态注入url

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商店RouteMapwerkzeug

我试过还添加装饰方法类似的方式来控制器:

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

回答

3

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

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

您可以覆盖/扩展其中的任何一个以实现您自己的动态路由,与web模块的模式相似。


备用路由:用于动态处理不符合现有的“静态”的规则要求一个有趣的选择是ir.http_handle_exception() method。只要在请求处理阶段出现异常,就会调用它,包括找不到匹配的路由。它返回的任何内容都将用作响应。

web的模块它延伸到:

+0

回顾这些方法。目前唯一的解决方案是使用路由生成类。但是,我们如何将路由添加到'routing_map()'outside @ http.route装饰器之外? –

+0

调度的使用有助于解决问题。 –