iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
Odoo

Odoo 魔法學院: 一步一腳印帶你成為客製化大師系列 第 22

[Day22] 第一次用外部 API 就上手:最簡單的 Python 和 XML-RPC 結合

  • 分享至 

  • xImage
  •  

外部 Odoo API 可以分為 XML-RPC 和 JSON-RPC,我們先來演示 XML-RPC,這是為了之後的 Client App 做鋪墊,執行環境及語言是 Python Interpreter,很便捷的方式。

這邊簡單講一下 RPC (Remote Procedure Call),可以理解成,本機端機器傳送一段指令給遠端伺服器,使其在遠端伺服器上執行某些指令,並將結果回傳給本機端機器,就像是老闆要我們社畜做事,結果要記得回報給老闆,哈哈。

不用登入也能使用的方法

在 Odoo XML-RPC 中,不用登入,也能連結到 xmlrpc/2/common 端點,調用 Odoo 伺服器公開的方法,像是確認 Odoo 伺服器的 Odoo 版本,和確認登入細節。

Odoo 伺服器版本:version()

使用 xmlrpc/2/common 端點的方法 version(),不需要任何參數,並會回傳 Dict

>>> from xmlrpc import client
>>> server = "http://localhost:8069"
>>> common = client.ServerProxy("%s/xmlrpc/2/common" %server)
>>> common.version()
{'server_version': '15.0', 'server_version_info': [15, 0, 0, 'final', 0, ''], 'server_serie': '15.0', 'protocol_version': 1}

首先建立連線,連線到 xmlrpc/2/common,接著可以直接針對物件調用 version() 了。

別忘了,先啟動伺服器歐 ;-) --- 文西

接著都會用到的 Odoo UID:authenticate(...)

在後續的操作中,會大量使用到透過 authenticate(...) 方法得到的 User ID,像在伺服器端搜尋或讀取 records。

authenticate(...) 的四個參數,分別是 Database Name, DB Username, DB PasswordsUser Agent,並且會回傳 User ID (uid),我們這邊只用前三個參數,

>>> db, username, password = "library", "YOUR_DB_USERNAME", "YOUR_DB_PASSWORDS"
>>> uid = common.authenticate(db,username,password, {})
>>> print(uid)
2

如果你是照著之前的步驟的話,帳密預設是 admin (小聲) --- 文西

調用伺服器的泛用型方法:execute_kw(...)

最直接存取 Odoo models 及 methods 的方法是使用 xmlrpc/2/object 的端點,當然,你是需要帳號密碼的,有了這個方法你就能調用 Odoo 裡常見的方法:search(), search_count(), read(), create(), write(), unlink() ...。

我們來試試看搜尋,登入帳號是 admin 的使用者有幾個,以及他的名子和公司。

搜尋結果數量 search_count

>>> api = client.ServerProxy("%s/xmlrpc/2/object" %server)
>>> domain = [("login", "=", "admin")]
>>> api.execute_kw(db, uid, password, "res.users", "search_count", [domain])
3

這邊的 domain 也就是我們要搜尋的條件,整個方法特別要注意第四個參數,目標是哪個 models,接著是使用哪一個方法,最後也就是方法的參數。

條件搜尋結果 search_read

>>> api = client.ServerProxy("%s/xmlrpc/2/object" %server)
>>> domain = [("login", "=", "admin")]
>>> api.execute_kw(db, uid, password, "res.users", "search_read", [], {"domain":domain, "fields":["name", "company_id"]})
[{'id': 2, 'name': 'Mitchell Admin', 'company_id': [1, 'YourCompany']}]

這邊我們用一樣的搜尋條件,但搜尋出來的結果我只對名子和公司有興趣。

幾乎一樣,所以使用 Odoo XML-RPC 的方法一定要去查,這些方法要怎麼使用,在把他丟到 execute_kw() 就行啦!

當然,你會發現,我用兩種函式調用方法:positional (或是說 list unpacking) 和 keywords 的方式 ;-)

第22天了,目前進度正常,還來得及在最後補上調整 Backend 和 Frontend View,繼續加油!

Ref:https://www.odoo.com/documentation/15.0/developer/reference/external_api.html


上一篇
[Day21] 實作催繳書籍功能 + 基礎功能驗證
下一篇
[Day23] 用 JSON-RPC 實作客戶端 App: 實務上我會使用 OdooRPC
系列文
Odoo 魔法學院: 一步一腳印帶你成為客製化大師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言