Создание надежных API имеет важное значение для бесшовной интеграции между бизнес-приложениями. Odoo 19, ведущая платформа ERP с открытым исходным кодом, предоставляет мощные возможности для создания REST-контроллеров, позволяющих внешним системам взаимодействовать с вашим экземпляром Odoo. Это подробное руководство проведет вас через процесс создания и внедрения REST-контроллеров в Odoo 19, от базовой настройки до обработки различных сценариев аутентификации.
Введение
REST-контроллеры в Odoo 19 позволяют предоставлять доступ к бизнес-логике через HTTP-конечные точки, что дает возможность сторонним приложениям получать доступ к данным в вашей системе Odoo и управлять ими. Независимо от того, нужно ли вам интегрироваться с мобильными приложениями, внешними сервисами или пользовательскими панелями мониторинга, REST-контроллеры предоставляют гибкое и масштабируемое решение. Следуя этому руководству, вы узнаете, как создавать эффективные REST-контроллеры, управлять аутентификацией и создавать надежные API-конечные точки.
Шаг 1: Импорт необходимых модулей
Для начала создания REST-контроллеров в Odoo 19 вам потребуется импортировать необходимые модули Python. Начните с основных зависимостей для обработки HTTP-запросов и данных JSON:
from odoo import http
from odoo.http import request
import json
Модуль http предоставляет основу для контроллера, модуль request позволяет получать доступ к данным входящих запросов, а модуль json дает возможность работать с JSON-данными. Эти модули являются основополагающими для создания REST-конечных точек в Odoo 19.
Шаг 2: Определите класс контроллера.
Создайте класс Python, наследующий от http.Controller . Этот класс послужит основой для ваших REST-эндпоинтов и будет содержать все обработчики маршрутов для вашего API .
class MyRestController(http.Controller):
"""
REST-контроллер для обработки API-запросов в Odoo 19.
Этот контроллер управляет различными конечными точками API для обработки данных.
"""
pass
Класс контроллера выступает в качестве контейнера для всех ваших маршрутов и методов API. Вы можете определить несколько маршрутов в рамках одного класса контроллера, логически организуя ваши конечные точки API.
Шаг 3: Создание маршрутов API с помощью декораторов
В Odoo 19 маршруты определяются с помощью декоратора `@http.route()` . Этот декоратор указывает URL-адрес конечной точки, тип запроса и метод аутентификации. Вот как можно структурировать базовый маршрут:
@http.route('/api/v1/endpoint', type='jsonrpc', auth='public')
def my_api_endpoint(self, **kwargs):
"""
Конечная точка API для обработки запросов.
"""
return {'status': 'success', 'message': 'Достигнута конечная точка API'}
Параметр type='jsonrpc' указывает, что запрос и ответ будут в формате JSON. Параметр auth определяет, требуется ли аутентификация. Эти параметры имеют решающее значение для определения поведения вашей конечной точки.
Шаг 4: Обработка параметров запроса
Для работы с входящими данными запроса в ваших API-интерфейсах используйте объект запроса, предоставляемый Odoo. Параметры запроса можно получить из аргументов kwargs или непосредственно из объекта запроса:
@http.route('/api/v1/data', type='jsonrpc', auth='user', methods=['POST'])
def process_data(self, **kwargs):
"""
Обработка входящих данных запроса.
"""
data = request.get_json_data()
name = data.get('name')
email = data.get('email')
return {
'status': 'success',
'received': {
'name': name,
'email': email
}
}
Объект request.get_json_data() содержит разобранные JSON-данные из входящего запроса. Это позволяет извлекать и обрабатывать параметры, отправляемые клиентскими приложениями.
Два сценария использования REST-контроллеров в Odoo 19
Odoo 19 поддерживает два основных сценария аутентификации для REST-контроллеров: аутентифицированные конечные точки, требующие входа пользователя, и общедоступные конечные точки, доступные без аутентификации. Выбор подхода зависит от ваших требований к безопасности и сценария использования.
Вариант 1: С аутентификацией (auth='user')
В этом сценарии конечная точка REST-контроллера требует от пользователей аутентификации перед доступом к API. Это гарантирует, что только авторизованные пользователи смогут взаимодействовать с конфиденциальными бизнес-данными.

Прежде чем обращаться к какой-либо аутентифицированной конечной точке при использовании внешних приложений (например, скриптов, мобильных приложений или интеграций), необходимо сначала получить действительную сессию, пройдя аутентификацию. Выполните следующие шаги:
- Отправьте запрос на аутентификацию по адресу /web/session/authenticate, указав имя вашей базы данных, имя пользователя и пароль.
- Используйте сессионный cookie для всех последующих вызовов API.
После аутентификации следует добавлять сессионный cookie-файл к каждому запросу.
При создании защищенных REST API в Odoo аутентификация имеет решающее значение для защиты конфиденциальных данных и обеспечения доступа к вашим конечным точкам только для авторизованных пользователей. В этом руководстве показано, как создавать аутентифицированные конечные точки API, требующие действительных пользовательских сессий.
Шаг 1: Настройка аутентифицированных маршрутов
При создании аутентифицированных конечных точек используйте параметр auth='user '. Это ограничит доступ только для авторизованных пользователей:
@http.route('/api/v1/products', type='jsonrpc', auth='user', methods=['GET', 'POST'])
def manage_products(self, **kwargs):
"""
Аутентифицированная конечная точка для управления продуктами.
Доступна только авторизованным пользователям.
"""
if request.httprequest.method == 'GET':
return self._get_products()
elif request.httprequest.method == 'POST':
return self._create_product()
Параметр auth ='user' гарантирует, что Odoo проверит сессию пользователя, прежде чем разрешить доступ к этой конечной точке. Если пользователь не аутентифицирован, Odoo вернет ошибку аутентификации.
Шаг 2: Реализация обработчиков аутентифицированных запросов
Разработайте логику для обработки аутентифицированных запросов. Вы можете получить доступ к текущему пользователю через объект запроса и выполнять операции от его имени:
Извлечение товаров из Odoo
Функция _get_products извлекает все товары из модели product.template в Odoo и возвращает их в структурированном формате JSON:
def _get_products(self):
"""Получить товары для аутентифицированного пользователя."""
try:
user = request.env.user
products = request.env['product.template'].search([])
product_data = [{
'id': product.id,
'name': product.name,
'price': product.list_price,
} for product in products]
return {
'status': 'success',
'user': user.name,
'products': product_data
}
except Exception as e:
return {
'status': 'error',
'message': str(e)
}

Создание продуктов в Odoo
Функция _create_product создает новую запись о товаре в системе учета запасов Odoo :
def _create_product(self):
"""
Создает новый продукт в каталоге товаров Odoo.
Эта функция проверяет входные данные и создает новую запись product.template
с предоставленными данными, такими как название, цена, тип, описание и т. д.
"""
data = request.get_json_data()
try:
product_data = data.get('params')
user = request.env.user
if not product_data.get('name'):
return {
'status': 'error',
'message': 'Название продукта обязательно'
}
product = request.env['product.template'].create({
'name': product_data.get('name'),
'list_price': product_data.get('price', 0.0),
'type': product_data.get('type', 'consu'),
'description': product_data.get('description', ''),
'default_code': product_data.get('default_code', ''),
})
return {
'status': 'success',
'message': 'Продукт успешно создан',
'product_id': product.id,
'product_name': product.name,
'created_by': user.name
}
except Exception as e:
return {
'status': 'error',
'message': f'Не удалось создать продукт: {str(e)}'
}


Вариант 2: Без аутентификации (auth='public')
В этом сценарии конечная точка REST-контроллера общедоступна и не требует аутентификации пользователя. Используйте этот подход для конечных точек, предоставляющих общую информацию или услуги, не связанные с конфиденциальными данными.
@http.route('/api/v1/products', type='jsonrpc', auth='public', methods=['GET', 'POST'])
def manage_products(self, **kwargs):
"""
Аутентифицированная конечная точка для управления продуктами.
Доступна только авторизованным пользователям.
"""
if request.httprequest.method == 'GET':
return self._get_products()
elif request.httprequest.method == 'POST':
return self._create_product()
Заключение
Теперь вы понимаете, как создавать REST-контроллеры в Odoo 19 для предоставления доступа к вашей бизнес-логике через HTTP API. Следуя шагам, описанным в этом руководстве, вы можете создавать аутентифицированные конечные точки для конфиденциальных операций и публичные конечные точки для обмена общей информацией. REST-контроллеры предоставляют мощный механизм для интеграции Odoo с внешними приложениями, обеспечивая синхронизацию данных в реальном времени, бэкэнды мобильных приложений и интеграцию со сторонними сервисами. Выбор между аутентифицированными и публичными конечными точками зависит от ваших конкретных требований к безопасности и сценария использования. Используйте гибкость фреймворка REST-контроллеров Odoo 19 для создания масштабируемых и поддерживаемых API, которые будут способствовать развитию вашего бизнеса.