Контроллеры
Контроллеры должны обеспечивать расширяемость, например Model
, но не могут использовать тот же механизм, что и база данных с загруженными модулями, но могут они быть не доступны (например, не создана или не выбрана база данных).
Таким образом, контроллеры предоставляют свой собственный механизм расширения, отдельный от моделей:
Контроллеры создаются с помощью наследования из Controller
. URL-маршруты определяются с помощью методов задекорированных с помощью 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()
Изменит для url-маршрута
/some_url
тип авторизации с public на user (требующего авторизацию)
API
URL-Маршрутизация
odoo.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, например, для форм):
- Если форма генерируется в 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
) – враппер для объекта werkzeug Requesthttprequest
оригинальный объект werkzeug.wrappers.Request
, предоставленный запросу
params
класс Mapping
параметров запроса, обычно не используются, поскольку они предоставляются непосредственно методу обработчика в качестве ключевых аргументов
cr
класс Cursor
, инициализированный для текущего вызова метода.
Когда текущий запрос использует авторизацию none
, доступ к курсору вызовет исключение.
context
класс Mapping
значений контекста для текущего запроса
env
класс Environment
, окружения связанного с текущим запросом.
session
класс OpenERPSession
содержащий данные для текущего сеанса HTTP
debug
Indicates whether the current request is in «debug» mode
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
.
Параметры соответствующего 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 могут быть изменены или даже заменены ответом статического ресурса.
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