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_context(**overrides)[源代码]¶
使用
overrides的值覆盖当前请求的环境上下文。要替换整个上下文,请改用update_env()。
- get_http_params()[源代码]¶
从查询字符串和请求体中的表单(包括 application/x-www-form-urlencoded 和 multipart/form-data)提取键值对。
- 返回
合并后的键值对。
- 返回类型
- 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
- 返回
一个响应对象。
- 返回类型
- make_json_response(data, headers=None, cookies=None, status=200)[源代码]¶
用于 JSON 响应的辅助工具,它会对
data进行 JSON 序列化,并在未提供时相应地设置 Content-Type 头。- 参数
data – 将被 JSON 序列化为响应主体的数据
status (int) – HTTP 状态码
cookies (collections.abc.Mapping) – 要在客户端设置的 Cookie
- 返回类型
- class odoo.http.JsonRPCDispatcher(request)[源代码]¶
-
- dispatch(endpoint, args)[源代码]¶
基于 HTTP 的 JSON-RPC 2 。
我们的实现与规范在两点上有所不同:
JSON-RPC 请求负载中的
method成员被忽略,因为 HTTP 路径已经用于将请求路由到控制器。我们仅支持按名称传递参数结构,即 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)[源代码]¶
-
- dispatch(endpoint, args)[源代码]¶
执行与 HTTP 相关的操作,例如反序列化请求体和查询字符串,并在将请求分发到
type='http'路由时检查 CORS 和 CSRF。有关兼容的端点返回类型的详细信息,请参阅
load()方法。
- handle_error(exc: Exception) collections.abc.Callable[源代码]¶
处理在将请求分发到
type='http'路由时发生的任何异常。还处理以下情况下的异常:没有匹配的路由路径、无法提供备用页面以及请求的Content-Type不是 JSON。- 参数
exc (Exception) – 发生的异常。
- 返回
一个 WSGI 应用程序