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_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
- 返回类型
- not_found(description=None)[源代码]¶
`HTTP 404 <http://tools.ietf.org/html/rfc7231#section-6.5.4>`_(未找到)响应的快捷方式
- 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='json'
路由时发生的任何异常。还处理以下情况下的异常:没有匹配的路由路径、无法提供备用页面以及请求的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 应用程序
响应¶
- class odoo.http.Response(*args, **kw)[源代码]¶
包含主体、状态、头信息并支持 QWeb 的传出 HTTP 响应。除了
werkzeug.wrappers.Response
参数外,此类的构造函数还可以接受以下用于 QWeb 惰性渲染的附加参数。- 参数
这些属性作为参数存在于 Response 对象上,并且可以在渲染之前随时修改。
还公开了
werkzeug.wrappers.Response
的所有属性和方法。