iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
Odoo

用 Odoo 打造數位轉型引擎:從基礎建置到跨領域應用系列 第 12

Day 12:Odoo Controllers 與 REST API 實作

  • 分享至 

  • xImage
  •  

到目前為止,我們已經熟悉了 Odoo 的 Model 與 View,這些功能主要用於內部系統的資料管理。但若企業需要與外部系統(例如電商平台、行動應用、IoT 裝置)交換資料,就需要用到 ControllersREST API。今天我們將介紹 Odoo 中的 Controller 概念,並透過範例建立一個簡單的 API。


1. Odoo Controller 的角色

在 Odoo 中,Controller 負責處理 HTTP 請求,扮演「使用者/外部系統 ↔ Odoo 內部模型」的橋樑。

  • Controller 使用 Python 定義。
  • 路由透過 @http.route 裝飾器設定。
  • 可以返回 HTML 頁面(QWeb 渲染)或 JSON 格式資料(常見於 API)。

2. 建立 Controller

先在模組中新增一個資料夾 controllers/,並建立檔案 controllers/hello_controller.py

範例:

from odoo import http

class HelloController(http.Controller):
    @http.route('/hello', type='http', auth='public')
    def hello(self, **kwargs):
        return "Hello from Odoo Controller!"

啟動 Odoo 後,訪問 http://localhost:8069/hello,即可看到文字輸出。


3. 建立 REST API

若要讓外部系統存取 Odoo 資料,可以透過 JSON 格式回傳。

範例:建立一個查詢書籍清單的 API。

from odoo import http

class LibraryAPI(http.Controller):
    @http.route('/api/books', type='json', auth='public', methods=['GET'])
    def list_books(self, **kwargs):
        books = http.request.env['library.book'].search([])
        return [{'id': b.id, 'title': b.name, 'author': b.author} for b in books]

啟動後,訪問:

curl -X GET http://localhost:8069/api/books

回傳結果會是:

[
  {"id": 1, "title": "Odoo Basics", "author": "Tom"},
  {"id": 2, "title": "Advanced Odoo", "author": "Alice"}
]

4. 認證與安全性

  • auth='public':任何人都能訪問(開放 API)。
  • auth='user':需要登入 Odoo 帳號。
  • auth='none':完全跳過驗證(非常危險,不建議)。

在實務上,建議搭配 API KeyOAuth2 進行授權,確保資料不會被未授權的外部系統濫用。


5. 小結

Odoo Controllers 讓系統不再是「封閉式 ERP」,而是能與外部世界互動的平台。

  • 使用 @http.route 定義路由。
  • 可輸出 HTML(網站頁面)或 JSON(REST API)。
  • 搭配 ORM,能快速將內部資料轉換為 API 供應。

在下一篇文章中,我將示範如何 擴充 CRM 模組功能,帶你從官方模組下手,體驗真正的二次開發。


上一篇
Day 11:Odoo Views(XML/QWeb)的定義與設計
系列文
用 Odoo 打造數位轉型引擎:從基礎建置到跨領域應用12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言