<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【odoo14】【好書學(xué)習(xí)】第二十章、odoo的遠程過程調(diào)用

      老韓頭的開發(fā)日常 ? 【好書學(xué)習(xí)】系列

      odoo支持遠程過程調(diào)用(RPC),你可以通過其他的應(yīng)用連接odoo的實例。比如,我們可以通過使用java編寫的android應(yīng)用連接odoo實例展示過期的訂單信息。通過odoo的RPC API,我們可以操作數(shù)據(jù)庫的CURD。odoo的RPC不僅僅局限于數(shù)據(jù)庫的CURD,還支持對象的方法調(diào)用。odoo的RPC依然適用于odoo內(nèi)部的權(quán)限管理機制。odoo的RPC適用于任意平臺、任意語言調(diào)用。
      odoo提供了兩種類型RPC,XML-RPC和JSON-RPC。本章,我們將學(xué)習(xí)如何使用RPC。最后,我們將使用OCA的odoorpc包實現(xiàn)odoo的RPC調(diào)用。
      本章內(nèi)容如下:

      1. 通過XML-RPC實現(xiàn)登錄odoo
        2. 通過XML-RPC獲取和讀取數(shù)據(jù)(未完成)
        3. 通過XML-RPC創(chuàng)建、更新、刪除數(shù)據(jù)(未完成)
        4. 通過XML-RPC調(diào)用函數(shù)(未完成)
      2. 通過JSON-RPC登錄odoo
        6. 通過JSON-RPC過濾及搜索數(shù)據(jù)
        7. 通過JSON-RPC創(chuàng)建、更新、刪除數(shù)據(jù)
        8. 通過JSON-RPC調(diào)用函數(shù)
      3. OCA的odoorpc庫(超好用)
      4. 生成API key

      技術(shù)需求

      本章,我們將使用第十九章的my_library模塊??梢奊itHub repository: https://github.com/ PacktPublishing/Odoo-12-Development-Cookbook-Third-Edition/tree/master/Chapter19/r0_initial_module.

      假設(shè)你已經(jīng)有一個在運行的odoo實例,http://localhost:8069,使用名為book-db-14的數(shù)據(jù)庫,安裝了名為my_library的模塊。

      通過XML-RPC實現(xiàn)登錄odoo

      本節(jié),我們通過RPC實現(xiàn)用戶驗證并檢查用戶憑證是否有效。

      準備

      步驟

      1. 添加odoo_authenticate.py文件,放在哪里隨意。
      2. 添加代碼
      from xmlrpc import client
      
      server_url = "http://localhost:8069"
      db_name = "book-db-14"
      username = "admin"
      password = "admin"
      common = client.ServerProxy("%s/xmlrpc/2/common" % server_url)
      user_id = common.authenticate(db_name, username, password, {})
      if user_id:
          print("Success: User id is", user_id)
      else:
          print("Failed: wrong credentials")
      
      1. 運行文件
      python3 odoo_authenticate.py
      

      原理

      本節(jié),我們通過python的xmlrpc包實現(xiàn)訪問odoo實例。這是python自帶的標準包,不用額外安裝。

      odoo提供/xmlrpc/2/common節(jié)點用于XML-RPC調(diào)用。此端點用于不需要身份驗證的元方法。authentication()方法本身是一個公共方法,因此可以公開調(diào)用它。authentication()方法接受四個參數(shù)——數(shù)據(jù)庫名稱、用戶名、密碼和用戶代理環(huán)境。用戶代理環(huán)境是一個強制參數(shù),但是如果您不想傳遞用戶代理參數(shù),至少要傳遞空字典。

      當您使用所有有效參數(shù)執(zhí)行authenticate()方法時,它將調(diào)用Odoo服務(wù)器并執(zhí)行身份驗證。然后,如果給定的登錄ID和密碼是正確的,它將返回用戶ID。如果用戶不存在或者密碼不正確,則返回False。

      在通過RPC訪問任何數(shù)據(jù)之前,您需要使用authenticate()方法。這是因為使用錯誤的憑據(jù)訪問數(shù)據(jù)將產(chǎn)生錯誤。

      小貼士
      Odoo的在線實例(*.odoo.com)使用OAuth認證,
      因此,本地密碼沒有在實例上設(shè)置。要在這些實例上使用XML-RPC,您需要從實例的Settings | Users | Users菜單手動設(shè)置用戶的密碼。

      此外,用于訪問數(shù)據(jù)的方法需要用戶ID,而不是用戶名,因此需要使用authenticate()方法來獲取用戶ID。

      更多

      /xmlrpc/2/common端點提供了另一個方法:version()。您可以在沒有憑據(jù)的情況下調(diào)用此方法。它將返回Odoo實例的版本信息。version()方法的使用示例如下:

      from xmlrpc import client
      server_url = 'http://localhost:8069'
      common = client.ServerProxy('%s/xmlrpc/2/common' % server_url)
      version_info = common.version()
      print(version_info)
      

      輸出如下

      通過XML-RPC搜索和讀取數(shù)據(jù)

      通過XML-RPC創(chuàng)建、更新、刪除數(shù)據(jù)

      通過XML-RPC調(diào)用函數(shù)

      通過JSON-RPC登錄odoo

      odoo提供了JSON-RPC。正如其名,JSON-RPC使用JSOM格式,并通過jsonrpc2.0實現(xiàn)。本節(jié),我們將演示如何使用JSON-RPC實現(xiàn)登錄及獲取數(shù)據(jù)。

      準備

      步驟

      1. 添加jsonrpc_authenticate.py文件
      2. 添加如下代碼:
      import json
      import random
      import requests
      
      server_url = "http://localhost:8069"
      db_name = "book-db-14"
      username = "admin"
      password = "admin"
      json_endpoint = "%s/jsonrpc" % server_url
      headers = {"Content-Type": "application/json"}
      
      
      def get_json_payload(service, method, *args):
          return json.dumps(
              {
                  "jsonrpc": "2.0",
                  "method": "call",
                  "params": {"service": service, "method": method, "args": args},
                  "id": random.randint(0, 100000000),
              }
          )
      
      payload = get_json_payload("common", "login", db_name, username, password)
      response = requests.post(json_endpoint, data=payload, headers=headers)
      user_id = response.json()["result"]
      if user_id:
          print("Success: User id is", user_id)
      else:
          print("Failed: wrong credentials")
      
      1. 運行參數(shù)
      python3 jsonrpc_authenticate.py
      

      結(jié)果如下:

      原理

      JSON-RPC使用JSON格式通過/jsonrpc端點與服務(wù)器交互數(shù)據(jù)。在我們的例子中,我們使用python的requests包發(fā)起post請求,當然,你也可以通過其他的包,比如urllib。
      JSON-RPC僅支持JSON-RPC 2.0格式的數(shù)據(jù)負載。你可在https://www.jsonrpc.org/specification。在我們的例子中,我們新建了get_json_payload()方法。該方法負責(zé)將數(shù)據(jù)封裝成JSON-RPC 2.0格式的負載。方法接受三個參數(shù),service、method及可變參數(shù)。JSON-RPC請求體是以JSON格式的,同時請求頭需包含{"Content-Type": "application/json"}。返回結(jié)果也是JSON格式的。

      與XML-RPC類似,所有公開的方法都位于common服務(wù)中。因此,我們以service=common,method=login準備負載。登錄函數(shù)需要額外的參數(shù),包括數(shù)據(jù)庫名稱、賬戶、密碼。當我們的賬戶密碼通過驗證后,將得到用戶的ID。

      小貼士
      get_json_payload()可實現(xiàn)代碼復(fù)用。

      更多

      JSON-RPC同樣支持version函數(shù)。我們可以獲取odoo實例的版本信息。如下:

      import json
      import random
      import requests
      
      server_url = 'http://localhost:8069'
      json_endpoint = '%s/jsonrpc' % server_url
      headers = {"Content-Type": "application/json"}
      
      def get_json_payload(service, method, *args):
      	...
      payload = get_json_payload('common', 'version')
      response = requests.post(json_endpoint, data=payload, headers=headers)
      
      print(response.json())
      

      結(jié)果如下:

      通過JSON-RPC獲取及搜索數(shù)據(jù)

      本節(jié),我們將了解如何通過JSON-RPC獲取數(shù)據(jù)。

      準備

      步驟

      1. 添加jsonrpc_fetch_data.py文件
      2. 添加代碼
      # place authentication and get_json_payload methods (see first jsonrpc recipe)
      if user_id:
          # search for the book's ids
          search_domain = ['|', ['name', 'ilike', 'odoo'],['name', 'ilike', 'sql']]
          payload = get_json_payload("object", "execute_kw",db_name, user_id, password, 'library.book', 'search',[search_domain], {'limit': 5})
          res = requests.post(json_endpoint, data=payload,
              headers=headers).json() print('Search Result:', res)
          # ids will be in result keys
          # read data for books ids
          payload = get_json_payload("object", "execute_kw", db_name, user_id, password,'library.book', 'read', [res['result'],['name', 'date_release']])
          res = requests.post(json_endpoint, data=payload, headers=headers).json() print('Books data:', res)
      else:
          print("Failed: wrong credentials")
      
      1. 運行腳本
      python3 jsonrpc_fetch_data.py
      

      結(jié)果如下:

      原理

      在上一節(jié)中,我們通過JSON-RPC登錄系統(tǒng)并獲得用戶的ID。現(xiàn)在我們可以通過用戶的ID來獲取模型數(shù)據(jù)了。我們需要使用search及read來獲取數(shù)據(jù)。為了獲取數(shù)據(jù),我們調(diào)用了object作為service,execute_kw()作為method執(zhí)行查詢。execute_kw函數(shù)的參數(shù)如下:

      • 數(shù)據(jù)庫的名稱
      • 用戶的ID
      • 密碼
      • 模型名稱
      • 方法名稱
      • args,變量數(shù)組
      • kwargs,字典變量

      在我們的例子中,我們調(diào)用了search方法。execute_kw()函數(shù)將強制變量作為位置變量,將可選變量作為關(guān)鍵字變量。在search方法中,domain是強制變量,可選變量Limit是關(guān)鍵字變量。
      步驟2,我們調(diào)用了read方法獲取圖書的詳細信息。并將圖書id的列表及字段的列表作為參數(shù)。

      小貼士
      我們也可以使用execute方法。該方法并不支持關(guān)鍵字變量,因此如果你想傳遞一些可選參數(shù),你需要傳遞所有的中間參數(shù)。

      更多

      與XML-RPC類似,我們可以使用search_read()方法代替search()及read()方法的組合。如下:

      # place authentication and get_json_payload methods (see firstjsonrpc recipe)
      if user_id:
          # search and read for the book's ids 
          search_domain = ['|', ['name', 'ilike', 'odoo'],['name', 'ilike', 'sql']]
          payload = get_json_payload("object", "execute_kw", db_name, user_id, password, 'library.book', 'search_read', [search_domain, ['name', 'date_release']], {'limit': 5})
          res = requests.post(json_endpoint, data=payload, headers=headers).json() print('Books data:', res)
      else:
          print("Failed: wrong credentials")
      

      通過JSON-RPC創(chuàng)建、更新、刪除數(shù)據(jù)

      本節(jié),我們將學(xué)習(xí)如何通過RPC實現(xiàn)CRUD。

      準備

      步驟

      1. 添加jsonrpc_operation.py文件
      2. 添加代碼
      # place authentication and get_json_payload method (seelast recipe for more)
      if user_id:
          # creates the books records 
          create_data = [
              {'name': 'Book 1', 'date_release':
              '2019-01-26'},
              {'name': 'Book 3', 'date_release':
              '2019-02-12'},
              {'name': 'Book 5', 'date_release':
              '2019-05-08'},
              {'name': 'Book 7', 'date_release':
              '2019-05-14'} ]
          payload = get_json_payload("object", "execute_kw",db_name, user_id, password, 'library.book','create', [create_data])
          res = requests.post(json_endpoint, data=payload,headers=headers).json() 
          print("Books created:", res) 
          books_ids = res['result']
          # Write in existing book record 
          book_to_write = books_ids[1]
          # We will use ids of recently created books 
          write_data = {'name': 'Book 2'}
          payload = get_json_payload("object", "execute_kw",db_name, user_id, password, 'library.book','write', [book_to_write, write_data])
          res = requests.post(json_endpoint, data=payload,headers=headers).json() 
          print("Books written:", res)
          # Delete in existing book record 
          book_to_unlink = books_ids[2:]
          # We will use ids of recently created books 
          payload = get_json_payload("object", "execute_kw", db_name, user_id, password, 'library.book', 'unlink', [book_to_unlink])
          res = requests.post(json_endpoint, data=payload,headers=headers).json() 
          print("Books deleted:", res)
      else:
          print("Failed: wrong credentials")
      
      1. 運行
      python3 jsonrpc_operation.py
      

      結(jié)果如下:

      如果操作成功,write和unlink方法返回True。這意味著,如果您的響應(yīng)為True,則假定一條記錄已被成功更新或刪除。

      原理

      execute_kw()函數(shù)用于create、update和delete運算。自odoo12,create方法支持同時創(chuàng)建多條數(shù)據(jù)。

      小貼士
      當您嘗試創(chuàng)建記錄而沒有為required字段提供值時,JSON-RPC和XML-RPC都會生成一個錯誤,因此請確保您已經(jīng)將所有required字段添加到創(chuàng)建值中。

      更多

      與XML-RPC一樣,您可以使用JSON-RPC中的check_access_rights方法來檢查您是否有執(zhí)行該操作的訪問權(quán)限。這個方法需要兩個參數(shù)——模型名稱和操作名稱。在下面的示例中,我們檢查create操作的訪問權(quán)限:

      # place authentication and get_json_payload method (see lastrecipe for more)
      if user_id:
          payload = get_json_payload("object", "execute_kw", db_name, user_id, password,'library.book', 'check_access_rights', ['create']) 
          res = requests.post(json_endpoint, data=payload, headers=headers).json()
          print("Has create access:", res['result'])
      else:
          print("Failed: wrong credentials")
      

      結(jié)果如下:

      通過JSON-RPC調(diào)用函數(shù)

      本節(jié),我們將學(xué)習(xí)如何通過JSON-RPC調(diào)用模型方法。比如,我們將調(diào)用圖書模型的make_available()方法改變圖書的狀態(tài)。

      準備

      步驟

      1. 添加jsonrpc_method.py文件
      2. 添加代碼:
      # place authentication and get_json_payload method (see last recipe for more)
      if user_id:
          # Create the book in draft state
          payload = get_json_payload("object", "execute_kw",db_name, user_id, password,'library.book', 'create', [{'name': 'Book 1','state': 'draft'}])
          res = requests.post(json_endpoint, data=payload,headers=headers).json()
          print("Has create access:", res['result']) 
      	book_id = res['result']
          # Change the book state by calling make_available
          # method
          payload = get_json_payload("object", "execute_kw",db_name, user_id, password,'library.book', 'make_available', [book_id]) 
          res = requests.post(json_endpoint, data=payload,headers=headers).json()
          # Check the book status after method call
          payload = get_json_payload("object", "execute_kw",db_name, user_id, password, 'library.book', 'read', [book_id,['name', 'state']])
          res = requests.post(json_endpoint, data=payload,headers=headers).json()
          print("Book state after the method call:",res['result'])
      else:
          print("Failed: wrong credentials")
      
      1. 運行文件
      python3 jsonrpc_method.py
      

      前面的命令將使用draft創(chuàng)建一本書,然后通過調(diào)用make_available方法更改該書的狀態(tài)。之后,我們將獲取圖書數(shù)據(jù)來檢查圖書的狀態(tài),這將產(chǎn)生以下輸出:

      原理

      execute_kw()能夠調(diào)用模型的任何公共方法。正如我們在通過XML-RPC配方調(diào)用方法中看到的,公共方法是那些名稱不以_(下劃線)開頭的方法。以_開頭的方法是私有的,你不能從JSON-RPC調(diào)用它們。
      在我們的示例中,我們創(chuàng)建了一個狀態(tài)為draft的書籍。然后,我們再進行一次RPC調(diào)用來調(diào)用make_available方法,這將把該書的狀態(tài)更改為available。最后,我們再進行一次RPC調(diào)用來檢查book的狀態(tài)。這將顯示該書的狀態(tài)已更改為available,如圖20.10所示。
      不返回任何內(nèi)容的方法在內(nèi)部默認返回None。這些方法不能從RPC中使用。因此,如果您想使用來自RPC的方法,至少要添加return True語句。

      OCA的odoorpc庫(超好用)

      OCA提供了名為odoorpc的包。可為我們提供便捷的方式與odoo實例交互。安裝odoorpc:

      pip install OdooRPC
      

      步驟

      1. 添加odoorpc_library.py文件
      2. 添加代碼
      import odoorpc
      
      db_name = 'book-db-14'
      user_name = 'admin'
      password = 'admin'
      
      # Prepare the connection to the server
      odoo = odoorpc.ODOO('localhost', port=8069)
      odoo.login(db_name, user_name, password) # login
      
      # User information
      user = odoo.env.user
      print(user.name)
      print(user.company_id.name)
      print(user.email)
      
      BookModel = odoo.env['library.book']
      search_domain = ['|', ['name', 'ilike', 'odoo'], ['name', 'ilike', 'sql']]
      books_ids = BookModel.search(search_domain, limit=5)
      for book in BookModel.browser(books_ids):
      	print(book.name, book.date_release)
      	
      # create the book and update the state
      book_id = BookModel.create({'name': 'Test book', 'state': 'draft'})
      print("Book state before make_available:", book.state) 
      book = BookModel.browse(book_id)
      book.make_available()
      book = BookModel.browse(book_id)
      print("Book state before make_available:", book.state)
      
      1. 運行文件
      python3 odoorpc_library.py
      

      結(jié)果如下:

      原理

      odoorpc在底層使用的jsonrpc實現(xiàn)與odoo的交互。

      更多

      odoorpc為我們做了非常完美的封裝,但我們依然可以會用原生的RPC語法:

      import odoorpc
      db_name = 'book-db-14' 
      user_name = 'admin' 
      password = 'admin'
      # Prepare the connection to the server
      odoo = odoorpc.ODOO('localhost', port=8069) 
      odoo.login(db_name, user_name, password) # login
      books_info = odoo.execute('library.book', 'search_read', [['name', 'ilike', 'odoo']], ['name', 'date_release'])
      print(books_info)
      

      參考

      還有幾個其他的odoo rpc包,如下:

      生成API key

      odoo14開始支持雙因素認證(Two-Factor Authentication, 2FA)。2FA是用戶帳戶的額外安全層,用戶需要輸入密碼和基于時間的代碼。如果您已經(jīng)啟用了2FA,那么您將不能通過輸入用戶ID和密碼來使用RPC。要解決這個問題,您需要為用戶生成一個API密鑰。本節(jié),我們將看到如何生成API密鑰。

      步驟

      1. 打開用戶首選項并打開帳戶安全選項卡。

      2. 點擊New API Key按鈕:

      3. 它將打開一個彈出窗口,如下圖所示。輸入API密鑰名和點擊Generate key按鈕:

      4. 這將生成API密鑰,并在一個新的彈出窗口中顯示它。記下API鍵,因為你還需要它:

      一旦生成了API密鑰,您就可以開始以與普通密碼相同的方式為RPC使用API密鑰。

      原理

      使用API鍵很簡單。然而,有一些事情你需要注意。API密鑰是為每個用戶生成的,如果您希望為多個用戶使用RPC,則需要為每個用戶生成API密鑰。此外,用戶的API密鑰將擁有與用戶相同的訪問權(quán)限,因此如果某人獲得了密鑰的訪問權(quán)限,他們可以執(zhí)行用戶可以執(zhí)行的所有操作。因此,您需要對API密鑰保密。

      小貼士
      生成API密鑰時,只顯示一次。你得把這個鍵記下來。如果你失去了它,就沒有辦法再找回來了。在這種情況下,您需要刪除API鍵并生成一個新的API鍵。

      使用API密鑰非常簡單。在RPC調(diào)用期間,您只需要使用API密鑰而不是用戶密碼。即使激活了2FA,你也可以調(diào)用RPC。

      posted @ 2021-03-14 12:07  老韓頭的開發(fā)日常  閱讀(1279)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产地址二永久伊甸园| 色欲av亚洲一区无码少妇| 房山区| 国产成人免费ā片在线观看| 自拍偷自拍亚洲精品情侣| 人妻聚色窝窝人体WWW一区 | 午夜福利宅福利国产精品| 日韩免费视频一一二区| 熟女丝袜潮喷内裤视频网站| 日日碰狠狠添天天爽五月婷 | 2021亚洲va在线va天堂va国产| 深夜福利啪啪片| 成人精品日韩专区在线观看| 国模粉嫩小泬视频在线观看| 中文字幕日韩精品一区二区三区| 红桃视频成人传媒| 乱人伦人妻精品一区二区| 精品 日韩 国产 欧美 视频| 久久中文字幕一区二区| 久热这里只有精品视频3| 国产精品无码av不卡| 最新国产精品亚洲| 极品美女自拍偷精品视频| 日本亚洲欧洲无免费码在线| 婷婷五月综合激情| 国产国产午夜福利视频| 欧美激情一区二区三区成人| 99久久免费精品色老| 亚洲国产精品一区二区久| 99久久婷婷国产综合精品青草漫画 | 人妻被猛烈进入中文字幕| 亚洲国产中文字幕精品| 九九色这里只有精品国产| 熟女少妇精品一区二区| 中文字幕一区有码视三区| 美女黄18以下禁止观看| 亚洲综合另类小说色区色噜噜 | 性欧美三级在线观看| 午夜在线不卡| 国产精品一区二区小视频| 亚洲色欲色欱WWW在线|