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) – 请求类型,可以是 'jsonrpc''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' 类型请求启用,默认对 'jsonrpc' 类型请求禁用。

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

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

  • captcha (str) – 验证码的操作名称。设置后,请求将根据验证码实现进行验证。失败时,这些请求将返回 UserError。

  • save_session (bool) – 是否应在 http 响应上设置 session_id cookie 并将脏会话保存到磁盘。对于 auth='bearer' 默认为 False 。其他情况默认为 True

请求

请求对象会在请求开始时自动设置到 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 令牌字符串

返回类型

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 (未找到)响应的快捷方式

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='jsonrpc' 路由时发生的任何异常。还处理当没有路由匹配请求路径、无法提供回退页面且请求 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 应用程序

响应

odoo.http.Response[源代码]

alias of odoo.http._Response