Web 控制器

控制器

控制器需要提供可扩展性,这与 Model 很像,但不能使用相同的机制,因为前置条件(一个已加载模块的数据库)可能尚不可用(例如尚未创建数据库,或未选择数据库)。

因此,控制器提供了自己的扩展机制,与模型的扩展机制相互独立:

控制器通过 继承 Controller 来创建。路由通过使用 route() 装饰的方法来定义::

class MyController(odoo.http.Controller):
    @route('/some_url', auth='public')
    def handler(self):
        return stuff()

要 覆盖 一个控制器,需从其类 继承,覆盖相关方法,并在必要时重新暴露它们::

class Extension(MyController):
    @route()
    def handler(self):
        do_before()
        return super(Extension, self).handler()
  • 必须使用 route() 装饰,才能保持该方法(及其路由)可见:如果重新定义方法时未加装饰器,它将被“取消发布”

  • 所有方法的装饰器会被合并:如果重写方法的装饰器没有参数,则保留先前所有装饰器;任何提供的参数都会覆盖先前定义的参数,例如::

    class Restrict(MyController):
        @route(auth='user')
        def handler(self):
            return super(Restrict, self).handler()
    

    会将 /some_url 从 public 身份验证改为 user 身份验证(需要登录)

API

路由

请求

在请求开始时,请求对象会被自动设置到 odoo.http.request 上。

响应