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)[源代码]¶
Decorate a controller method in order to route incoming requests matching the given URL and options to the decorated method.
警告
It is mandatory to re-decorate any method that is overridden in controller extensions but the arguments can be omitted. See
Controller
for more details.- 参数
route (Union[str, Iterable[str]]) – The paths that the decorated method is serving. Incoming HTTP request paths matching this route will be routed to this decorated method. See werkzeug routing documentation for the format of route expressions.
type (str) – The type of request, either
'json'
or'http'
. It describes where to find the request parameters and how to serialize the response.auth (str) –
The authentication method, one of the following:
'user'
: The user must be authenticated and the current request will be executed using the rights of the user.'bearer'
: The user is authenticated using an “Authorization” request header, using the Bearer scheme with an API token. The request will be executed with the permissions of the corresponding user. If the header is missing, the request must belong to an authentication session, as for the “user” authentication method.'public'
: The user may or may not be authenticated. If he isn’t, the current request will be executed using the shared Public user.'none'
: The method is always active, even if there is no database. Mainly used by the framework and authentication modules. The request code will not have any facilities to access the current user.
methods (Iterable[str]) – A list of http methods (verbs) this route applies to. If not specified, all methods are allowed.
cors (str) – The Access-Control-Allow-Origin cors directive value.
csrf (bool) – Whether CSRF protection should be enabled for the route. Enabled by default for
'http'
-type requests, disabled by default for'json'
-type requests.readonly (Union[bool, Callable[[registry, request], bool]]) – Whether this endpoint should open a cursor on a read-only replica instead of (by default) the primary read/write database.
handle_params_access_error (Callable[[Exception], Response]) – Implement a custom behavior if an error occurred when retrieving the record from the URL parameters (access error or missing error).
请求¶
请求对象会在请求开始时自动设置到 odoo.http.request
上。
- class odoo.http.Request(httprequest)[源代码]¶
Wrapper around the incoming HTTP request with deserialized request parameters, session utilities and request dispatching logic.
- update_context(**overrides)[源代码]¶
Override the environment context of the current request with the values of
overrides
. To replace the entire context, please useupdate_env()
instead.
- default_lang()[源代码]¶
Returns default user language according to request specification
- 返回
Preferred language if specified or ‘en_US’
- 返回类型
- get_http_params()[源代码]¶
Extract key=value pairs from the query string and the forms present in the body (both application/x-www-form-urlencoded and multipart/form-data).
- 返回
The merged key-value pairs.
- 返回类型
- make_response(data, headers=None, cookies=None, status=200)[源代码]¶
Helper for non-HTML responses, or HTML responses with custom response headers or cookies.
While handlers can just return the HTML markup of a page they want to send as a string if non-HTML data is returned they need to create a complete response object, or the returned data will not be correctly interpreted by the clients.
- 参数
data (str) – response body
status (int) – http status code
headers (
[(name, value)]
) – HTTP headers to set on the responsecookies (collections.abc.Mapping) – cookies to set on the client
- 返回
a response object.
- 返回类型
- make_json_response(data, headers=None, cookies=None, status=200)[源代码]¶
Helper for JSON responses, it json-serializes
data
and sets the Content-Type header accordingly if none is provided.- 参数
data – the data that will be json-serialized into the response body
status (int) – http status code
headers (List[(str, str)]) – HTTP headers to set on the response
cookies (collections.abc.Mapping) – cookies to set on the client
- 返回类型
- class odoo.http.JsonRPCDispatcher(request)[源代码]¶
- classmethod is_compatible_with(request)[源代码]¶
Determine if the current request is compatible with this dispatcher.
- dispatch(endpoint, args)[源代码]¶
JSON-RPC 2 over HTTP.
Our implementation differs from the specification on two points:
The
method
member of the JSON-RPC request payload is ignored as the HTTP path is already used to route the request to the controller.We only support parameter structures by-name, i.e. the
params
member of the JSON-RPC request payload MUST be a JSON Object and not a JSON Array.
In addition, it is possible to pass a context that replaces the session context via a special
context
argument that is removed prior to calling the endpoint.Successful request:
--> {"jsonrpc": "2.0", "method": "call", "params": {"arg1": "val1" }, "id": null} <-- {"jsonrpc": "2.0", "result": { "res1": "val1" }, "id": null}
Request producing a error:
--> {"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 [源代码]¶
Handle any exception that occurred while dispatching a request to a
type='json'
route. Also handle exceptions that occurred when no route matched the request path, that no fallback page could be delivered and that the requestContent-Type
was json.- 参数
exc – the exception that occurred.
- 返回
a WSGI application
- class odoo.http.HttpDispatcher(request)[源代码]¶
- classmethod is_compatible_with(request)[源代码]¶
Determine if the current request is compatible with this dispatcher.
- dispatch(endpoint, args)[源代码]¶
Perform http-related actions such as deserializing the request body and query-string and checking cors/csrf while dispatching a request to a
type='http'
route.See
load()
method for the compatible endpoint return types.
- handle_error(exc: Exception) collections.abc.Callable [源代码]¶
Handle any exception that occurred while dispatching a request to a
type='http'
route. Also handle exceptions that occurred when no route matched the request path, when no fallback page could be delivered and that the requestContent-Type
was not json.- 参数
exc (Exception) – the exception that occurred.
- 返回
a WSGI application
回应¶
- class odoo.http.Response(*args, **kw)[源代码]¶
Outgoing HTTP response with body, status, headers and qweb support. In addition to the
werkzeug.wrappers.Response
parameters, this class’s constructor can take the following additional parameters for QWeb Lazy Rendering.- 参数
these attributes are available as parameters on the Response object and can be altered at any time before rendering
Also exposes all the attributes and methods of
werkzeug.wrappers.Response
.- classmethod load(result, fname='<function>')[源代码]¶
Convert the return value of an endpoint into a Response.
- 参数
result (Union[Response, werkzeug.wrappers.BaseResponse, werkzeug.exceptions.HTTPException, str, bytes, NoneType]) – The endpoint return value to load the Response from.
fname (str) – The endpoint function name wherefrom the result emanated, used for logging.
- 返回
The created
Response
.- 返回类型
- 引发
TypeError – When
result
type is none of the above- mentioned type.
- flatten()[源代码]¶
Forces the rendering of the response’s template, sets the result as response body and unsets
template
- set_cookie(key, value='', max_age=None, expires=- 1, path='/', domain=None, secure=False, httponly=False, samesite=None, cookie_type='required')[源代码]¶
The default expires in Werkzeug is None, which means a session cookie. We want to continue to support the session cookie, but not by default. Now the default is arbitrary 1 year. So if you want a cookie of session, you have to explicitly pass expires=None.