Маршрутизация
odoo.http.route(route=None, **kw)[исходный код]
Декоратор, который помечает метод как обработчик запросов. Этот метод должен быть частью подкласса Controller
.
- route -- Строка или массив. Часть маршрута, которая будет определять, какие HTTP-запросы будут соответствовать декодируемому методу. Может быть как одной строкой, так и массивом строк. См. Документацию маршрутизации werkzeug для формата маршрута (http://werkzeug.pocoo.org/docs/routing/).
- type -- Тип запроса может быть как
'http'
так и'json'
. - auth -- Тип метода авторизации, может иметь следующие значения: *
user
: пользователь должен быть авторизован, и текущий запрос будет выполняться с правами доступа данного пользователя. *public
: пользователь не обязан быть авторизован. Если нет, то текущий запрос будет выполнен с использованием общего общего пользователя. *none
: В основном использоуется фреймворком и модулями авторизации. Код запроса не будет иметь никаких средств для доступа ни к базе данных ни какой либо информации указывающей на текущую базу данны и текущего пользователя - methods -- Последовательность HTTP-методов, к которым относится данный маршрут. Если ничего не указано, то разрешены все методы.
- cors -- Значение директивы Access-Control-Allow-Origin cors.
- csrf (
bool
) -- Необходимо ли включить защиту CSRF для маршрута. По умолчанию используетсяTrue
. Для получения дополнительной информации смотрите Защита CSRF.
Защита CSRF
Добавлено в версии 9.0.
В Odoo реализована защита CSRF, основанная на токенах.
CSRF-защита включена по умолчанию и применяется к HTTP-методам UNSAFE, как определено в RFC 7231 (все методы, кроме GET
, HEAD
, TRACE
и OPTIONS
).
Защита CSRF реализуется путем проверки запросов с использованием небезопасных методов для значения, называемого csrf_token
, как части данных формы запроса. Это значение удаляется из формы как часть проверки и не должно учитываться при обработке собственной формы.
При добавлении нового контроллера для небезопасного метода (в основном POST, например, для форм):
Если форма генерируется в Python, токен CSRF доступен через
request.csrf_token() <odoo.http.WebRequest.csrf_token()
. В шаблонах QWeb (python) объектrequest
доступен по умолчанию. Если вы не используете QWeb его, возможно, придется добавить явно.Если форма генерируется в Javascript, токен CSRF по умолчанию добавляется в контекст визуализации QWeb (js) как
csrf_token
и в остальном доступен какcsrf_token
в модулеweb.core
:require('web.core').csrf_token
Если вызываемый объект может быть вызван из вне (не из Odoo), например, это API REST или webhook запрос, защита CSRF должна быть отключена на данном объекте. Если возможно, используйте другие методы проверки запроса (чтобы убедиться, что он не вызван независимой третьей стороной).
Запрос
Объект запроса автоматически устанавливается в начале запроса odoo.http.request
class odoo.http.WebRequest(httprequest)[исходный код]
Родительский класс для всех типов Odoo Web запросов , в основном используется для инициализации и настройки объекта запроса (диспетчеризация должна быть обработана подклассами)
werkzeug.wrappers.BaseRequest
) -- Объект wrapped werkzeug Requesthttprequest
Оригинальный объект werkzeug.wrappers.Request
, предоставленный запросу
params
Класс Mapping
параметров запроса, обычно не используются, поскольку они предоставляются непосредственно методу обработчика в качестве аргументов ключевого слова
cr
Класс Cursor
, инициализированный для текущего вызова метода.
Когда текущий запрос использует авторизацию none
, доступ к курсору вызовет исключение.
context
Класс Mapping
из контекстных значений для текущего запроса
env
Класс Environment
, привязанный к текущему запросу.
session
Класс OpenERPSession
содержащий данные HTTP для текущего сеанса
debug
Указывает, находится ли текущий запрос в режиме «отладки»
registry
Запись в базе данных, связанной с этим запросом. Может быть None
, если текущий запрос использует тип авторизации none
.
Не рекомендуется, начиная с версии 8.0: используйте env
db
База данных, связанная с этим запросом. Может быть None
, если текущий запрос использует тип авторизации none
.
csrf_token(time_limit=3600)[исходный код]
Генерирует и возвращает токен CSRF для текущего сеанса.
int | None
) -- Токен CSRF должен действовать только в течение заданного времени (в секундах), по умолчанию 1h, None
- токен будет действительным до тех пор, пока активна сессия текущего пользователя.class odoo.http.HttpRequest(*args)[исходный код]
Обработчик для запросов типа http
.
Параметры сопоставленной маршрутизации, параметры строки запроса, параметры 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 могут быть изменены или даже заменены статическим ответом.
class odoo.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 odoo.http.Response(*args, **kw)[исходный код]
Объект ответа передается через цепочку маршрутов контроллера.
В дополнение к параметрам werkzeug.wrappers.Response
, конструктор этого класса может принимать следующие дополнительные параметры для отложенного отображения шаблона QWeb.
эти атрибуты доступны в качестве параметров в объекте Response и могут быть изменены в любое время перед отображением
Также предоставляет все атрибуты и методы класса werkzeug.wrappers.Response
.
render()[исходный код]
Возвращает результат и отображает шаблон ответа,
flatten()[исходный код]
Принудительное отображение шаблона ответа, устанавливает результат как тело ответа и отменяет template
Контроллеры.
Контроллеры должны обеспечивать расширяемость, например Model
, но не могут использовать тот же механизм, что и предпосылки (база данных с загруженными модулями), могут быть не доступны (например, не создана или не выбрана база данных).
Таким образом, контроллеры предоставляют свой собственный механизм расширения, отдельный от моделей данных:
Контроллеры создаются путем наследования
class odoo.http.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
тип авторизации с public на user (требующего входа в систему)