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 的认证方式从公开更改为用户(需要登录)。

API

路由

@odoo.http.route(route=None, **routing)[源代码]

装饰控制器方法,以便将匹配给定 URL 和选项的传入请求路由到被装饰的方法。

警告

必须重新装饰在控制器扩展中被覆盖的任何方法,但可以省略参数。详情请参见 Controller

参数
  • route (Union[str, Iterable[str]]) – 被装饰方法服务的路径。与该路由匹配的传入 HTTP 请求路径将被路由到此装饰方法。有关路由表达式的格式,请参阅 werkzeug 路由文档

  • type (str) – 请求的类型,可以是 'json''http'。它描述了如何获取请求参数以及如何序列化响应。

  • auth (str) –

    认证方法,以下之一:

    • 'user':用户必须经过身份验证,当前请求将使用用户的权限执行。

    • 'bearer':用户通过“Authorization”请求头进行身份验证,使用带有 API 令牌的 Bearer 方案。请求将使用相应用户的权限执行。如果缺少该头信息,则请求必须属于身份验证会话,类似于“user”认证方法。

    • 'public':用户可能已认证也可能未认证。如果未认证,当前请求将使用共享的公共用户执行。

    • 'none':即使没有数据库,该方法也始终处于活动状态。主要用于框架和认证模块。请求代码将无法访问当前用户。

  • methods (Iterable[str]) – 此路由适用的 HTTP 方法(动词)列表。如果未指定,则允许所有方法。

  • cors (str) – Access-Control-Allow-Origin CORS 指令的值。

  • csrf (bool) – 是否应为此路由启用 CSRF 保护。对于 'http' 类型的请求,默认启用;对于 'json' 类型的请求,默认禁用。

  • readonly (Union[bool, Callable[[registry, request], bool]]) – 此端点是否应在只读副本上打开游标,而不是(默认情况下)主读写数据库。

  • handle_params_access_error (Callable[[Exception], Response]) – 如果从 URL 参数中检索记录时发生错误(访问错误或缺失错误),实现自定义行为。

请求

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

class odoo.http.Request(httprequest)[源代码]

围绕传入 HTTP 请求的包装器,包含反序列化的请求参数、会话工具和请求分发逻辑。

update_env(user=None, context=None, su=None)[源代码]

更新当前请求的环境。

参数
  • user (int or res.users record) – 可选的用户/用户 ID,用于更改当前用户。

  • context (dict) – 可选的上下文字典,用于更改当前上下文。

  • su (bool) – 可选的布尔值,用于更改超级用户模式。

update_context(**overrides)[源代码]

使用 overrides 的值覆盖当前请求的环境上下文。要替换整个上下文,请改用 update_env()

csrf_token(time_limit=None)[源代码]

生成并返回当前会话的 CSRF 令牌。

参数

time_limit (Optional[int]) – CSRF 令牌仅在指定的持续时间(以秒为单位)内有效,默认为 48 小时,None 表示令牌在当前用户的会话有效期内一直有效。

返回

ASCII token string

返回类型

str

validate_csrf(csrf)[源代码]

给定的 CSRF 令牌是否有效?

参数

csrf (str) – 要验证的令牌。

返回

有效时为 True,无效时为 False

返回类型

bool

default_lang()[源代码]

根据请求规范返回默认用户语言。

返回

如果指定了首选语言,则返回该语言,否则返回 ‘en_US’。

返回类型

str

get_http_params()[源代码]

从查询字符串和请求体中的表单(包括 application/x-www-form-urlencoded 和 multipart/form-data)提取键值对。

返回

合并后的键值对。

返回类型

dict

make_response(data, headers=None, cookies=None, status=200)[源代码]

用于非 HTML 响应或带有自定义响应头或 Cookie 的 HTML 响应的辅助工具。

虽然处理器可以直接返回页面的 HTML 标记作为字符串,但如果返回的是非 HTML 数据,则需要创建一个完整的响应对象,否则客户端将无法正确解析返回的数据。

参数
  • data (str) – 响应主体

  • status (int) – HTTP 状态码

  • headers ([(name, value)]) – 要设置在响应中的 HTTP 头

  • cookies (collections.abc.Mapping) – 要在客户端设置的 Cookie

返回

一个响应对象。

返回类型

Response

make_json_response(data, headers=None, cookies=None, status=200)[源代码]

用于 JSON 响应的辅助工具,它会对 data 进行 JSON 序列化,并在未提供时相应地设置 Content-Type 头。

参数
  • data – 将被 JSON 序列化为响应主体的数据

  • status (int) – HTTP 状态码

  • headers (List[(str, str)]) – 要设置在响应中的 HTTP 头

  • cookies (collections.abc.Mapping) – 要在客户端设置的 Cookie

返回类型

Response

not_found(description=None)[源代码]

`HTTP 404 <http://tools.ietf.org/html/rfc7231#section-6.5.4>`_(未找到)响应的快捷方式

render(template, qcontext=None, lazy=True, **kw)[源代码]

QWeb 模板的延迟渲染。

给定模板的实际渲染将在调度结束时进行。在此期间,模板和/或 qcontext 可以被修改,甚至可以被静态响应替换。

参数
  • template (str) – 要渲染的模板

  • qcontext (dict) – 要使用的渲染上下文

  • lazy (bool) – 是否应将模板渲染推迟到最后可能的时刻

  • kw (dict) – 转发到 werkzeug 的 Response 对象

reroute(path, query_string=None)[源代码]

使用新的路径和查询字符串重写当前请求的 URL。这相当于轻量级重定向,不会向浏览器返回 3xx 响应,但会更改当前 URL。

class odoo.http.JsonRPCDispatcher(request)[源代码]
classmethod is_compatible_with(request)[源代码]

确定当前请求是否与此调度器兼容。

dispatch(endpoint, args)[源代码]

基于 HTTP 的 JSON-RPC 2

我们的实现与规范在两点上有所不同:

  1. JSON-RPC 请求负载中的 method 成员被忽略,因为 HTTP 路径已经用于将请求路由到控制器。

  2. 我们仅支持按名称传递参数结构,即 JSON-RPC 请求负载中的 params 成员必须是 JSON 对象,而不是 JSON 数组。

此外,可以通过特殊的 context 参数传递一个上下文,以替换会话上下文,该参数会在调用端点之前被移除。

成功请求示例:

--> {"jsonrpc": "2.0", "method": "call", "params": {"arg1": "val1" }, "id": null}

<-- {"jsonrpc": "2.0", "result": { "res1": "val1" }, "id": null}

产生错误的请求示例:

--> {"jsonrpc": "2.0", "method": "call", "params": {"arg1": "val1" }, "id": null}

<-- {"jsonrpc": "2.0", "error": {"code": 1, "message": "End user error message.", "data": {"code": "codestring", "debug": "traceback" } }, "id": null}
handle_error(exc: Exception) collections.abc.Callable[源代码]

处理在将请求分发到 type='json' 路由时发生的任何异常。还处理以下情况下的异常:没有匹配的路由路径、无法提供备用页面以及请求的 Content-Type 为 JSON。

参数

exc – 发生的异常。

返回

一个 WSGI 应用程序

class odoo.http.HttpDispatcher(request)[源代码]
classmethod is_compatible_with(request)[源代码]

确定当前请求是否与此调度器兼容。

dispatch(endpoint, args)[源代码]

执行与 HTTP 相关的操作,例如反序列化请求体和查询字符串,并在将请求分发到 type='http' 路由时检查 CORS 和 CSRF。

有关兼容的端点返回类型的详细信息,请参阅 load() 方法。

handle_error(exc: Exception) collections.abc.Callable[源代码]

处理在将请求分发到 type='http' 路由时发生的任何异常。还处理以下情况下的异常:没有匹配的路由路径、无法提供备用页面以及请求的 Content-Type 不是 JSON。

参数

exc (Exception) – 发生的异常。

返回

一个 WSGI 应用程序

响应

class odoo.http.Response(*args, **kw)[源代码]

包含主体、状态、头信息并支持 QWeb 的传出 HTTP 响应。除了 werkzeug.wrappers.Response 参数外,此类的构造函数还可以接受以下用于 QWeb 惰性渲染的附加参数。

参数
  • template (str) – 要渲染的模板

  • qcontext (dict) – 要使用的渲染上下文

  • uid (int) – 用于 ir.ui.view 渲染调用的用户 ID,使用 None 表示使用请求的用户(默认值)。

这些属性作为参数存在于 Response 对象上,并且可以在渲染之前随时修改。

还公开了 werkzeug.wrappers.Response 的所有属性和方法。

classmethod load(result, fname='<function>')[源代码]

将端点的返回值转换为响应对象。

参数
返回

创建的 Response

返回类型

Response

引发

TypeError – 当 result 类型不是上述提到的类型时。

render()[源代码]

渲染响应的模板并返回结果。

flatten()[源代码]

强制渲染响应的模板,将结果设置为响应主体并取消设置 template

Werkzeug 中的默认过期时间为 None,这意味着会话 Cookie。我们希望继续支持会话 Cookie,但不将其设为默认值。现在默认值为任意 1 年。因此,如果您需要会话 Cookie,则必须显式传递 expires=None。