Toggle navigation

网络控制器

路由(Routing)

请求(Request)

请求对象在请求开始时被自动设置于 odoo.http.request

响应(Response)

控制器(Controllers)

控制器需要提供扩展性, 很像模型( Model ), 但是不使用相同的机制, 因为其先决条件 (一个载入模块的数据库) 可能并没有准备好 (比如没有创建数据库, 或者没有选择数据库).

因此控制器提供了他们自己的扩展机制, 与模型(model)的是分开的:

控制器是通过继承( inheriting )

来创建的, 并且定义了方法, 这个方法被如下函数装饰 route():

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

为了 复写(override) 一个控制器, 继承( inherit ) 它的类并且复写相关的方法, 如果需要的话, 使他们重新曝光:

class Extension(MyController):
    @route()
    def handler(self):
        do_before()
        return super(Extension, self).handler()
  • route() 装饰, 这对于保证这个方法(和路由)可见是必须的: 如果这个方法重新定义时没有被装饰, 它就会成为"未发布的(unpublished)"
  • 所有方法的装饰器是链接的, 如果复写方法的装饰器没有参数, 所有之前的参数会被保留, 任何提供的参数会覆盖之前已经定义的参数, 例如:

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

    会改变 /some_url 的认证, 从公共变成用户(需要登录)