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_context(**overrides)[源代码]¶
使用
overrides
的值覆盖当前请求的环境上下文。如需替换整个上下文,请使用update_env()
代替。
- property geoip¶
获取远程地址地理定位信息。
当地理定位成功时,返回值是一个字典,其格式为:
- {‘city’: str, ‘country_code’: str, ‘country_name’: str,
‘纬度’: 浮点数, ‘经度’: 浮点数, ‘地区’: 字符串, ‘时区’: 字符串}
当地理定位失败时,将返回一个空字典。
- 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)[源代码]¶
JSON-RPC 2 over HTTP.
我们的实现在两个方面与规范不同:
JSON-RPC请求有效载荷的
method
成员被忽略,因为HTTP路径已经用于将请求路由到控制器。我们仅支持按名称的参数结构,即 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)[源代码]¶
-
- 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 惰性渲染的附加参数。- 参数
这些属性可以作为 Response 对象的参数使用,并且在渲染之前随时可以进行修改。
同时还公开了
werkzeug.wrappers.Response
的所有属性和方法。- set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None, cookie_type='required')[源代码]¶
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 HTTPShttponly – 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”.