Веб-контролери¶
Контролери¶
Контролери мають забезпечувати розширюваність, подібно до 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 env¶
Environment
прив’язане до поточного запиту.
- session¶
OpenERPSession
зберігає дані HTTP-сеансу для поточного http-сеансу
- property registry¶
Реєстр до бази даних, пов’язаної з цим запитом. Може бути
None
, якщо поточний запит використовуєnone
автентифікацію.Застаріло починаючи з версії 8.0: використовуйте
env
- property db¶
База даних, пов’язана з цим запитом. Може бути
None
, якщо поточний запит використовуєnone
автентифікацію.
- 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 для встановлення на клієнті
- 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.- Параметри
ці атрибути доступні як параметри в об’єкті Response і можуть бути змінені в будь-який час перед відтворенням
Також розкриває всі атрибути та методи
werkzeug.wrappers.Response
.