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
的位置。
我还尝试以如下方式向 Controller 添加装饰方法:
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 和 there in 9.0 )。
该映射是延迟计算的,并通过 routing_map()
方法( 8.0 、 9.0 )暴露给 ir.http 模型中的扩展模块。在请求处理期间,ir.http._dispatch()
会调用 ir.http._find_handler()
方法,以在 routing_map
中查找匹配的路由>.
您可以覆盖/扩展其中任何一个来实现您自己的动态路由,类似于 web
模块的做法。
后备路由:动态处理与现有“静态”规则不匹配的请求的一个有趣的替代方案是 _handle_exception()
method ir.http 的。只要在请求处理阶段发生异常,包括找不到匹配的路由时,就会调用它。它返回的任何内容都将用作响应。
web
模块将其扩展为:
- 提供“用户友好”的错误页面(404、500 等)
- 允许用户将任意后备路由绑定(bind)到文档 coming from the attachments (
ir.attachment
) tables .
有时会使用这种转换“黑客”来映射以前网站的 URL。
关于python - 奥杜。在 werkzeug 中动态注入(inject) url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35445449/