Toggle navigation

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

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

openerp.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.

Запрос

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

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

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

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

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

params

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

env

Класс Environment, привязанный к текущему запросу. Вызывает RuntimeError, если текущие запросы не привязаны к базе данных.

context

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

session

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

cr

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

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

debug

Указывает, находится ли текущий запрос в режиме «отладки»

session_id

Непрозрачный идентификатор для экземпляра класса OpenERPSession текущего запроса

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

registry

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

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

db

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

httpsession

Данные сеанса HTTP

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

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

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

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

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

Контроллеры должны обеспечивать расширяемость, например как Model, но не могут использовать тот же механизм, что и предпосылки (база данных с загруженными модулями), могут быть не доступны (например, не создана или не выбрана база данных).

Таким образом, контроллеры предоставляют свой собственный механизм расширения, отдельный от моделей данных:

Контроллеры создаются путем наследования

class openerp.http.Controller[исходный код]

и определением методов, декорируемых 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()
  • Декорирование с помощью route() необходимо для сохранения видимости метода (и маршрута): если метод переопределяется без декорирования, он не будет опубликован

  • Декораторы всех методов объединены, если декоратор переопределяющего метода не имеет аргументов, все предыдущие декораторы будут сохранены, любой аргумент переопределит ранее определенные, например:

    class Restrict(MyController):
        @route(auth='user')
        def handler(self):
            return super(Restrict, self).handler()
    

    Изменит /some_url тип авторизации с public на user (требующего входа в систему)