Веб-контролери

Контролери

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

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

Контролери створюються шляхом успадкування від 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 з загальнодоступної автентифікації на користувача (потрібно ввійти в систему)

API

Маршрути

odoo.http.route(route=None, **kw)[source]

Декоратор позначає декорований метод як обробник запитів. Метод має бути частиною підкласу Контролер.

Параметри
  • 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 Protection для отримання додаткової інформації.

CSRF Protection

Нове в версії 9.0.

Odoo реалізує на основі токенів CSRF protection.

CSRF protection увімкнено за замовчуванням і застосовується до UNSAFE методів HTTP, як визначено RFC 7231 (усі методи, окрім GET, HEAD, TRACE і OPTIONS).

CSRF protection реалізується шляхом перевірки запитів за допомогою небезпечних методів на наявність значення під назвою csrf_token як частини даних форми запиту. Це значення видаляється з форми під час перевірки, і його не потрібно враховувати під час обробки вашої форми.

Під час додавання нового контролера для небезпечного методу (переважно POST для, наприклад, форм):

  • якщо форму згенеровано в Python, маркер csrf доступний через request.csrf_token() <odoo.http.WebRequest.csrf_token(), об’єкт request доступний за замовчуванням у шаблонах QWeb (python), його, можливо, доведеться додати явно, якщо ви не використовуєте QWeb.

  • якщо форму створено в Javascript, маркер CSRF за замовчуванням додається до контексту відтворення QWeb (js) як csrf_token, а в інших випадках він доступний як csrf_token у модулі web.core:

    require('web.core').csrf_token
    
  • якщо кінцева точка може бути викликана зовнішніми сторонами (не з Odoo), як, наприклад, це REST API або вебхук, захист CSRF має бути вимкнено на кінцевій точці. Якщо можливо, ви можете застосувати інші методи перевірки запиту (щоб переконатися, що його не викликає непов’язана третя сторона).

Запит

Об’єкт запиту автоматично встановлюється на odoo.http.request на початку запиту

class odoo.http.WebRequest(httprequest)[source]

Батьківський клас для всіх типів веб-запитів Odoo, здебільшого займається ініціалізацією та налаштуванням об’єкта запиту (саме відправлення має здійснюватися підкласами)

Параметри

httprequest (werkzeug.wrappers.BaseRequest) – загорнутий об’єкт запиту werkzeug

httprequest

оригінальний об’єкт werkzeug.wrappers.Request, наданий у запиті

params

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

property cr

Cursor ініціалізовано для поточного виклику методу.

Доступ до курсору, коли поточний запит використовує автентифікацію none, призведе до виключення.

property context

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

property env

Environment прив’язане до поточного запиту.

session

OpenERPSession зберігає дані HTTP-сеансу для поточного http-сеансу

property registry

Реєстр до бази даних, пов’язаної з цим запитом. Може бути None, якщо поточний запит використовує none автентифікацію.

Застаріло починаючи з версії 8.0: використовуйте env

property db

База даних, пов’язана з цим запитом. Може бути None, якщо поточний запит використовує none автентифікацію.

csrf_token(time_limit=None)[source]

Створює та повертає маркер CSRF для поточного сеансу

Параметри

time_limit (int | None) – період дії маркера CSRF (у секундах) або None, щоб маркер був дійсним доки триває поточний сеанс користувача (за замовчуванням)

Повертає

Рядок маркера ASCII

class odoo.http.HttpRequest(*args)[source]

Обробник для типу запиту http.

відповідні параметри маршрутизації, параметри рядка запиту, параметри form і файли передаються в метод обробки як аргументи ключового слова.

У разі конфлікту імен параметри маршрутизації мають пріоритет.

Результатом методу обробки може бути:

  • хибне значення, у такому випадку відповідь HTTP буде HTTP 204 (Немає Вмісту)

  • об’єкт Werkzeug Response, який повертається як є

  • str або unicode, буде загорнуто в об’єкт Response та інтерпретовано як HTML

make_response(data, headers=None, cookies=None)[source]

Помічник для відповідей не у форматі HTML або відповідей у форматі HTML із спеціальними заголовками відповідей або файлами cookie.

Хоча обробники можуть просто повернути розмітку HTML сторінки, яку вони хочуть надіслати як рядок, якщо повертаються дані, що не є HTML, їм потрібно створити повний об’єкт відповіді, інакше повернуті дані не будуть правильно інтерпретовані клієнтами.

Параметри
  • data (basestring) – тіло відповіді

  • headers ([(name, value)]) – Заголовки HTTP для встановлення у відповіді

  • cookies (collections.abc.Mapping) – файли cookie для встановлення на клієнті

not_found(description=None)[source]

Ярлик для відповіді HTTP 404 (Не знайдено)

render(template, qcontext=None, lazy=True, **kw)[source]

Відкладений рендеринг шаблону QWeb.

Фактична візуалізація заданого шаблону відбудеться після завершення розсилки. Тим часом шаблон і/або qcontext можна змінити або навіть замінити статичною відповіддю.

Параметри
  • template (basestring) – шаблон для візуалізації

  • qcontext (dict) – Візуалізація контексту для використання

  • lazy (bool) – чи слід відкласти візуалізацію шаблону до останнього можливого моменту

  • kw – пересилається до об’єкта Werkzeug Response

class odoo.http.JsonRequest(*args)[source]

Обробник запитів для JSON-RPC 2 через HTTP

  • method ігнорується

  • params має бути об’єктом JSON (а не масивом) і передається як ключові аргументи до методу обробки

  • результат методу обробки повертається як result JSON-RPC і загортається у 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)[source]

Об’єкт відповіді пройшов через ланцюжок маршрутів контролера.

На додаток до параметрів werkzeug.wrappers.Response, конструктор цього класу може приймати наступні додаткові параметри для QWeb Lazy Rendering.

Параметри
  • template (basestring) – шаблон для візуалізації

  • qcontext (dict) – Візуалізація контексту для використання

  • uid (int) – Ідентифікатор користувача для виклику рендерингу ir.ui.view, None для використання користувача запиту (за замовчуванням)

ці атрибути доступні як параметри в об’єкті Response і можуть бути змінені в будь-який час перед відтворенням

Також розкриває всі атрибути та методи werkzeug.wrappers.Response.

render()[source]

Відтворює шаблон відповіді, повертає результат

flatten()[source]

Примусово відтворює шаблон відповіді, встановлює результат як тіло відповіді та скасовує template