Web контроллеры

Контроллеры

Контроллеры должны обеспечивать расширяемость, например 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.

Запрос

Объект запроса автоматически устанавливается в начале запроса odoo.http.request

class odoo.http.WebRequest(httprequest)[исходный код]

Родительский класс для всех типов Odoo Web запросов , в основном используется для инициализации и настройки объекта запроса (диспетчеризация должна быть обработана подклассами)

Параметры
httprequest (werkzeug.wrappers.BaseRequest) – враппер для объекта werkzeug Request
httprequest

оригинальный объект werkzeug.wrappers.Request, предоставленный запросу

params

класс Mapping параметров запроса, обычно не используются, поскольку они предоставляются непосредственно методу обработчика в качестве ключевых аргументов

cr

класс Cursor, инициализированный для текущего вызова метода.

Когда текущий запрос использует авторизацию none, доступ к курсору вызовет исключение.

context

класс Mapping значений контекста для текущего запроса

env

класс Environment, окружения связанного с текущим запросом.

session

класс OpenERPSession содержащий данные для текущего сеанса HTTP

registry

Запись в базе данных, связанной с этим запросом. Может быть None, если текущий запрос использует тип авторизации none.

Не рекомендуется, начиная с версии 8.0: используйте env

db

База данных, связанная с этим запросом. Может быть None, если текущий запрос использует тип авторизации none.

csrf_token(time_limit=3600)[исходный код]

Генерирует и возвращает токен CSRF для текущего сеанса

Параметры
time_limit (int | None) – Токен CSRF должен действовать только в течение заданного времени (в секундах), по умолчанию 1h, None - токен будет действительным до тех пор, пока активна сессия текущего пользователя.
Результат
ASCII строка токена
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 могут быть изменены или даже заменены ответом статического ресурса.

Параметры
  • template (basestring) – шаблон для рендеринга
  • qcontext (dict) – Контекста для использования при рендеринге
  • lazy (bool) – Следует ли откладывать рендеринг шаблона до последнего момента
  • kw – Перенаправляется в объект ответа werkzeug
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.

Параметры
  • template (basestring) – шаблон для рендеринга
  • qcontext (dict) – Контекста для использования при рендеринге
  • uid (int) – Идентификатор пользователя для вызова рендеринга ir.ui.view, при None используется идентификатор пользователя, отправившего запрос (по умолчанию)

эти атрибуты доступны в качестве параметров в объекте Response и могут быть изменены в любое время перед рендерингом

Также предоставляет все атрибуты и методы класса werkzeug.wrappers.Response.

render()[исходный код]

Возвращает результат и рендерит шаблон ответа,

flatten()[исходный код]

Принудительный рендеринг шаблона ответа, устанавливает результат как тело ответа и отменяет template