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

Контролери

Контролери мають забезпечувати розширюваність, подібно до 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, **routing)[source]

Декоруйте метод контролера, щоб направляти вхідні запити, що відповідають заданій URL-адресі та опціям, до декорованого методу.

Попередження

Обов’язково потрібно переоформити будь-який метод, який перевизначено в розширеннях контролера, але аргументи можна пропустити. Див. Controller для отримання додаткової інформації.

Параметри
  • route (Union[str, Iterable[str]]) – Шляхи, які обслуговує декорований метод. Вхідні шляхи HTTP-запитів, що відповідають цьому маршруту, будуть спрямовані до цього декорованого методу. Див. документація маршрутизації werkzeug для формату виразів маршрутизації.

  • type (str) – Тип запиту, або 'json', або 'http'. Він описує, де знайти параметри запиту та як серіалізувати відповідь.

  • auth (str) – Метод автентифікації, один із наступних: * 'user': Користувач має бути автентифікований, і поточний запит буде виконано з використанням прав користувача. * 'public': Користувач може бути автентифікований або ні. Якщо ні, поточний запит буде виконано з використанням спільного публічного користувача. * 'none': Метод завжди активний, навіть якщо немає бази даних. В основному використовується фреймворком та модулями автентифікації. Код запиту не матиме жодних можливостей для доступу до поточного користувача.

  • methods (Iterable[str]) – Список методів (дієслів) http, до яких застосовується цей маршрут. Якщо не вказано, дозволені всі методи.

  • cors (str) – Значення директиви Access-Control-Allow-Origin cors.

  • csrf (bool) – Чи слід увімкнути захист CSRF для маршруту. Увімкнено за замовчуванням для запитів типу 'http', вимкнено за замовчуванням для запитів типу 'json'.

  • handle_params_access_error (Callable[[Exception], Response]) – Реалізуйте власну поведінку, якщо під час отримання запису з параметрів URL-адреси сталася помилка (помилка доступу або помилка відсутності).

Запит

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

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

Обгортка навколо вхідного HTTP-запиту з десеріалізованими параметрами запиту, утилітами сеансу та логікою відправлення запитів.

update_env(user=None, context=None, su=None)[source]

Оновіть середовище поточного запиту.

Параметри
  • user (int or res.users record) – необов’язковий користувач/id користувача для зміни поточного користувача

  • context (dict) – необов’язковий контекстний словник для зміни поточного контексту

  • su (bool) – необов’язкове логічне значення для зміни режиму суперкористувача

update_context(**overrides)[source]

Перезапишіть контекст середовища поточного запиту значеннями overrides. Щоб замінити весь контекст, використовуйте update_env().

csrf_token(time_limit=None)[source]

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

Параметри

time_limit (Optional[int]) – Токен CSRF має бути дійсним лише протягом зазначеного часу (у секундах), за замовчуванням 48 годин, None для того, щоб токен був дійсним протягом усього сеансу поточного користувача.

Повертає

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

Тип повернення

str

validate_csrf(csrf)[source]

Чи є наданий токен csrf дійсним?

Параметри

csrf (str) – Токен для перевірки.

Повертає

True, якщо дійсне, False, якщо ні.

Тип повернення

bool

default_lang()[source]

Повертає мову користувача за замовчуванням відповідно до специфікації запиту

Повертає

Бажана мова, якщо вказано, або „en_US“

Тип повернення

str

get_http_params()[source]

Витягніть пари ключ=значення з рядка запиту та форм, присутніх у тілі запиту (як application/x-www-form-urlencoded, так і multipart/form-data).

Повертає

Об’єднані пари ключ-значення.

Тип повернення

dict

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

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

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

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

  • status (int) – код статусу http

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

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

Повертає

об’єкт відповіді.

Тип повернення

Response

make_json_response(data, headers=None, cookies=None, status=200)[source]

Допоміжний засіб для JSON-відповідей, він JSON-серіалізує data та відповідно встановлює заголовок Content-Type, якщо його не вказано.

Параметри
  • data – дані, які будуть JSON-серіалізовані в тіло відповіді

  • status (int) – код статусу http

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

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

Тип повернення

Response

not_found(description=None)[source]

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

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

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

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

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

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

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

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

class odoo.http.JsonRPCDispatcher(request)[source]
classmethod is_compatible_with(request)[source]

Визначте, чи сумісний поточний запит із цим диспетчером.

dispatch(endpoint, args)[source]

JSON-RPC 2 через HTTP.

Наша реалізація відрізняється від специфікації у двох пунктах:

  1. Учасник``method`` корисного навантаження запиту JSON-RPC ігнорується, оскільки шлях HTTP вже використовується для маршрутизації запиту до контролера.

  2. Ми підтримуємо структури параметрів лише за назвою, тобто елемент params корисного навантаження запиту JSON-RPC ПОВИНЕН бути об’єктом JSON, а не масивом JSON.

Крім того, можна передати контекст, який замінює контекст сеансу, за допомогою спеціального аргументу context, який видаляється перед викликом кінцевої точки.

Успішний запит:

--> {"jsonrpc": "2.0", "method": "call", "params": {"arg1": "val1" }, "id": null}

<-- {"jsonrpc": "2.0", "result": { "res1": "val1" }, "id": null}

Запит викликає помилку:

--> {"jsonrpc": "2.0", "method": "call", "params": {"arg1": "val1" }, "id": null}

<-- {"jsonrpc": "2.0", "error": {"code": 1, "message": "End user error message.", "data": {"code": "codestring", "debug": "traceback" } }, "id": null}
handle_error(exc: Exception) collections.abc.Callable[source]

Обробляти будь-які винятки, що виникли під час відправлення запиту до маршруту type='json'. Також обробляти винятки, що виникли, коли жоден маршрут не відповідав шляху запиту, коли не вдавалося доставити резервну сторінку та запит Content-Type був json.

Параметри

exc – виняток, що стався.

Повертає

додаток WSGI

class odoo.http.HttpDispatcher(request)[source]
classmethod is_compatible_with(request)[source]

Визначте, чи сумісний поточний запит із цим диспетчером.

dispatch(endpoint, args)[source]

Виконайте дії, пов’язані з http, такі як десеріалізація тіла запиту та рядка запиту, а також перевірка cors/csrf під час відправки запиту до маршруту ``type=“http““`.

Див. метод load() для сумісних типів повернення кінцевої точки.

handle_error(exc: Exception) collections.abc.Callable[source]

Обробляти будь-які винятки, що виникли під час відправлення запиту до маршруту type='http'. Також обробляти винятки, що виникли, коли жоден маршрут не відповідав шляху запиту, коли не вдавалося доставити резервну сторінку та запит Content-Type не був json.

Параметри

exc (Exception) – виняток, що стався.

Повертає

додаток WSGI

Відповідь

odoo.http.Response[source]

alias of odoo.http._Response