Веб-контролери¶
Контролери¶
Контролери мають забезпечувати розширюваність, подібно до 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_context(**overrides)[source]¶
Перезапишіть контекст середовища поточного запиту значеннями
overrides. Щоб замінити весь контекст, використовуйтеupdate_env().
- default_lang()[source]¶
Повертає мову користувача за замовчуванням відповідно до специфікації запиту
- Повертає
Бажана мова, якщо вказано, або „en_US“
- Тип повернення
- get_http_params()[source]¶
Витягніть пари ключ=значення з рядка запиту та форм, присутніх у тілі запиту (як application/x-www-form-urlencoded, так і multipart/form-data).
- Повертає
Об’єднані пари ключ-значення.
- Тип повернення
- 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 для встановлення на клієнті
- Повертає
об’єкт відповіді.
- Тип повернення
- 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 для встановлення на клієнті
- Тип повернення
- class odoo.http.JsonRPCDispatcher(request)[source]¶
- classmethod is_compatible_with(request)[source]¶
Визначте, чи сумісний поточний запит із цим диспетчером.
- dispatch(endpoint, args)[source]¶
JSON-RPC 2 через HTTP.
Наша реалізація відрізняється від специфікації у двох пунктах:
Учасник``method`` корисного навантаження запиту JSON-RPC ігнорується, оскільки шлях HTTP вже використовується для маршрутизації запиту до контролера.
Ми підтримуємо структури параметрів лише за назвою, тобто елемент
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