Web控制器

控制器

Controllers need to provide extensibility, much like Model, but can’t use the same mechanism as the pre-requisites (a database with loaded modules) may not be available yet (e.g. no database created, or no database selected).

因此,控制器提供了自己的扩展机制,与模型的扩展机制分开:

控制器通过从 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 routing documentation

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

  • auth (str) – 身份验证方法,以下之一: * 'user':用户必须经过身份验证,并且当前请求将使用用户的权限执行。 * 'public':用户可以或可以不经过身份验证。如果没有,当前请求将使用共享的公共用户执行。 * 'none':该方法始终处于活动状态,即使没有数据库。主要由框架和身份验证模块使用。请求代码将没有任何访问当前用户的功能。

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

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

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

请求

请求对象会在请求开始时自动设置到 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() 代替。

property geoip

获取远程地址地理定位信息。

当地理定位成功时,返回值是一个字典,其格式为:

{‘city’: str, ‘country_code’: str, ‘country_name’: str,

‘纬度’: 浮点数, ‘经度’: 浮点数, ‘地区’: 字符串, ‘时区’: 字符串}

当地理定位失败时,将返回一个空字典。

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的响应对象

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

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

dispatch(endpoint, args)[源代码]

JSON-RPC 2 over HTTP.

我们的实现在两个方面与规范不同:

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

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

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

请求成功:

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

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

请求产生错误:

--> {"jsonrpc": "2.0", "method": "call", "params": {"context": {}, "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相关的操作,例如反序列化请求正文和查询字符串,检查CORS/CSRF,同时将请求分派到 type='http' 路由。

请参阅 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

Sets a cookie. The parameters are the same as in the cookie Morsel object in the Python standard library but it accepts unicode data, too.

如果 cookie 头的大小超过 max_cookie_size,则会发出警告,但头部仍然会被设置。

参数
  • key – 要设置的cookie的键(名称)。

  • value – cookie的值。

  • max_age – 应该是一个秒数,或者 None (默认值),如果 cookie 只应该持续客户端浏览器会话的时间。

  • expires – 应该是一个 datetime 对象或UNIX时间戳。

  • path – 限制 cookie 的路径,如果没有指定,默认会覆盖整个域名。

  • domain – 如果您想设置跨域cookie。例如, domain=".example.com" 将设置一个可由域名 www.example.com , foo.example.com 等读取的cookie。否则,cookie将只能由设置它的域名读取。

  • secure – If True, the cookie will only be available via HTTPS

  • httponly – disallow JavaScript to access the cookie. This is an extension to the cookie standard and probably not supported by all browsers.

  • samesite – Limits the scope of the cookie such that it will only be attached to requests if those requests are “same-site”.