Toggle navigation

Web контроллеры - Odoo 11.0

Маршрутизация

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.

Запрос

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

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

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

Параметры
httprequest (werkzeug.wrappers.BaseRequest) -- Объект wrapped werkzeug Request
httprequest

Оригинальный объект 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 для текущего сеанса.

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

Параметры
  • 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

Контроллеры.

Контроллеры должны обеспечивать расширяемость, например 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 (требующего входа в систему)