URL-Маршрутизация
openerp.http.route(route=None, **kw)[исходный код]
Декоратор, который помечает метод как обработчик запросов. Этот метод должен быть частью подкласса Controller
.
- route -- Строка или массив. Часть url-маршрута, которая будет определять, какие HTTP-запросы будут соответствовать декодируемому методу. Может быть как одной строкой, так и массивом строк. См. Документацию по маршрутизации werkzeug для формата url-маршрута (http://werkzeug.pocoo.org/docs/routing/).
- type -- Тип запроса может быть как
'http'
так и'json'
. - auth -- Тип метода авторизации, может иметь следующие значения: *
user
: пользователь должен быть авторизован, и текущий запрос будет выполняться с правами доступа данного пользователя. *public
: пользователь не обязан быть авторизован. Если нет, то текущий запрос будет выполнен с использованием параметров, так называемого публичного пользователя. *none
: В основном используется фреймворком и модулями авторизации. Код запроса не будет иметь никаких средств для доступа ни к базе данных ни какой либо информации указывающей на текущую базу данных и текущего пользователя - methods -- Последовательность HTTP-методов, к которым относится данный url-маршрут. Если ничего не указано, то разрешены все методы.
- cors -- Значение директивы Access-Control-Allow-Origin cors.
- csrf (
bool
) -- Определяет, нужно ли включить защиту CSRF для url-маршрута. По умолчанию используетсяTrue
. Для получения дополнительной информации смотрите Защита CSRF.
Защита CSRF
Добавлено в версии 9.0.
В Odoo реализована защита CSRF, основанная на токенах.
CSRF-защита включена по умолчанию и применяется к UNSAFE HTTP-методам , как определено в RFC 7231 (все методы, кроме GET
, HEAD
, TRACE
и OPTIONS
).
Защита CSRF реализуется путем проверки запросов с использованием небезопасных методов для значения, называемого csrf_token
, как части данных формы запроса. Это значение удаляется из формы как часть проверки и не должно учитываться при обработке данных самой формы.
При добавлении нового контроллера для небезопасного метода (в основном POST, например, для форм):
- if the form is generated in Python, a csrf token is
available via
request.csrf_token() <openerp.http.WebRequest.csrf_token()
, therequest
object is available by default in QWeb (python) templates, it may have to be added explicitly if you are not using QWeb. Если форма генерируется в Javascript, токен CSRF по умолчанию добавляется в контекст рендеринга QWeb (js) по ключу
csrf_token
и в остальном доступен какcsrf_token
в модулеweb.core
:require('web.core').csrf_token
Если вызываемый объект может быть вызван из вне (не из Odoo), например, это API REST или webhook запрос, защита CSRF должна быть отключена на данном объекте. Если возможно, используйте другие методы проверки запроса (чтобы убедиться, что он не вызван независимой третьей стороной).
Запрос
The request object is automatically set on openerp.http.request
at
the start of the request
class openerp.http.WebRequest(httprequest)[исходный код]
Родительский класс для всех типов Odoo Web запросов , в основном используется для инициализации и настройки объекта запроса (диспетчеризация должна быть обработана подклассами)
werkzeug.wrappers.BaseRequest
) -- враппер для объекта werkzeug Requesthttprequest
оригинальный объект werkzeug.wrappers.Request
, предоставленный запросу
params
класс Mapping
параметров запроса, обычно не используются, поскольку они предоставляются непосредственно методу обработчика в качестве ключевых аргументов
env
The Environment
bound to current request.
Raises a RuntimeError
if the current requests is not bound
to a database.
context
класс Mapping
значений контекста для текущего запроса
session
a OpenERPSession
holding the HTTP session data for the
current http session
cr
Cursor
initialized for the current method
call.
Когда текущий запрос использует авторизацию none
, доступ к курсору вызовет исключение.
debug
Indicates whether the current request is in "debug" mode
session_id
opaque identifier for the OpenERPSession
instance of
the current request
Не рекомендуется, начиная с версии 8.0: Use the sid
attribute on session
registry
Запись в базе данных, связанной с этим запросом. Может быть None
, если текущий запрос использует тип авторизации none
.
Не рекомендуется, начиная с версии 8.0: используйте env
db
База данных, связанная с этим запросом. Может быть None
, если текущий запрос использует тип авторизации none
.
httpsession
HTTP session data
Не рекомендуется, начиная с версии 8.0: Use session
instead.
csrf_token(time_limit=3600)[исходный код]
Генерирует и возвращает токен CSRF для текущего сеанса
int | None
) -- Токен CSRF должен действовать только в течение заданного времени (в секундах), по умолчанию 1h, None
- токен будет действительным до тех пор, пока активна сессия текущего пользователя.class openerp.http.HttpRequest(*args)[исходный код]
Обработчик для запросов типа http
.
Параметры соответствующего url-маршрута, параметры строки запроса, параметры form и файлы передаются методу обработчика в качестве аргументов.
В случае конфликта имен приоритет имеют параметры маршрутизации.
Результатом метода-обработчика может быть:
несуществующее значение, и в этом случае HTTP-ответом будет HTTP 204 (No Content)
объект werkzeug Response, который возвращается как есть
str
илиunicode
, будут заключены в объект Response и интерпретированы как HTML
make_response(data, headers=None, cookies=None)[исходный код]
Помощник для ответов без HTML или HTML ответов с настраиваемыми заголовками ответа или файлами cookie.
В то время как обработчики могут просто вернуть разметку HTML страницы, которую они хотят отправить как строку, если возвращаются не-HTML данные, им необходимо создать полный объект ответа, или возвращенные данные не будут правильно интерпретироваться клиентами.
- data (
basestring
) -- тело ответа - headers (
[(name, value)]
) -- Заголовки HTTP для установки в объект ответа - cookies (
collections.Mapping
) -- Файлы cookie для установки на клиенте
not_found(description=None)[исходный код]
Ссылка на объект для ответа HTTP 404 (не найден)
render(template, qcontext=None, lazy=True, **kw)[исходный код]
Отложенный рендеринг шаблона QWeb.
Фактически рендеринг заданного шаблона произойдет в конце отправки. Между тем template и/или qcontext могут быть изменены или даже заменены ответом статического ресурса.
- template (
basestring
) -- шаблон для рендеринга - qcontext (
dict
) -- Контекста для использования при рендеринге - lazy (
bool
) -- Следует ли откладывать рендеринг шаблона до последнего момента - kw -- Перенаправляется в объект ответа werkzeug
class openerp.http.JsonRequest(*args)[исходный код]
Обработчик запросов для JSON-RPC 2 через HTTP
method
игнорируетсяparams
должен быть JSON объектом (не массивом) и передаваться как аргументы методу обработчикаРезультат метода обработчика возвращается в виде JSON-RPC
result
и входит в состав ответа JSON-RPC
Успешный запрос:
--> {"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}
Ответ
class openerp.http.Response(*args, **kw)[исходный код]
Объект ответа передается через цепочку маршрутов контроллера.
В дополнение к параметрам werkzeug.wrappers.Response
, конструктор этого класса может принимать следующие дополнительные параметры для отложенного рендеринга шаблона QWeb.
- template (
basestring
) -- шаблон для рендеринга - qcontext (
dict
) -- Контекста для использования при рендеринге - uid (
int
) -- Идентификатор пользователя для вызова рендеринга ir.ui.view, приNone
используется идентификатор пользователя, отправившего запрос (по умолчанию)
эти атрибуты доступны в качестве параметров в объекте Response и могут быть изменены в любое время перед рендерингом
Также предоставляет все атрибуты и методы класса werkzeug.wrappers.Response
.
render()[исходный код]
Возвращает результат и рендерит шаблон ответа,
flatten()[исходный код]
Принудительный рендеринг шаблона ответа, устанавливает результат как тело ответа и отменяет template
Контроллеры
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).
Таким образом, контроллеры предоставляют свой собственный механизм расширения, отдельный от моделей:
Controllers are created by inheriting from
class openerp.http.Controller[исходный код]
and defining methods decorated with route()
:
class MyController(openerp.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()
- decorating with
route()
is necessary to keep the method (and route) visible: if the method is redefined without decorating, it will be "unpublished" Декораторы всех методов объединяются, если декоратор переопределяющего метода не имеет аргументов, все предыдущие декораторы будут сохранены, любой аргумент переопределит ранее определенные, например:
class Restrict(MyController): @route(auth='user') def handler(self): return super(Restrict, self).handler()
Изменит для url-маршрута
/some_url
тип авторизации с public на user (требующего авторизацию)