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

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

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

Запрос

The request object is automatically set on openerp.http.request at the start of the request

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

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

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

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

params

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

env

The Environment bound to current request. Raises a RuntimeError if the current requests is not bound to a database.

context

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

session

a OpenERPSession holding the HTTP session data for the current http session

cr

Cursor initialized for the current method call.

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

debug

Indicates whether the current request is in "debug" mode

session_id

opaque identifier for the OpenERPSession instance of the current request

Не рекомендуется, начиная с версии 8.0: Use the sid attribute on session

registry

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

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

db

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

httpsession

HTTP session data

Не рекомендуется, начиная с версии 8.0: Use session instead.

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

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

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

Контроллеры

Controllers need to provide extensibility, much like Model, but can't use the same mechanism as the pre-requisites (a database with loaded modules) may not be available yet (e.g. no database created, or no database selected).

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

Controllers are created by inheriting from

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

and defining methods decorated with 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()
  • decorating with route() is necessary to keep the method (and route) visible: if the method is redefined without decorating, it will be "unpublished"
  • Декораторы всех методов объединяются, если декоратор переопределяющего метода не имеет аргументов, все предыдущие декораторы будут сохранены, любой аргумент переопределит ранее определенные, например:

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

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