環境
odoo-14.0.post20221212.tar
Web Controllers
Controllers
控制器需要提供可擴充套件性,就像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
從公共身份驗證更改為使用者身份驗證(需要登入)
一個簡單示例
程式碼組織結構如下:
odoo14\custom\estate\controllers\controller.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from odoo import http
import json
class TestApi(http.Controller):
@http.route('/test-api-service/testService/testReq', type='http',
auth="public", methods=['POST'], csrf=False, cors='*')
def test_api(self, **kwargs):
try:
print(kwargs)
return json.dumps({'code': 200, 'msg': '請求成功'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'code': 500, 'msg': '%s' % e}, ensure_ascii=False)
注意:不能直接返回json字典,bool值等,會提示不可返回不可呼叫物件,但是可直接返回字串,或者返回字串的函式,如下:
class TestApi(http.Controller):
@http.route('/test-api-service/testService/testReq', type='http',
auth="public", methods=['POST'], csrf=False, cors='*')
def test_api(self, **kwargs):
try:
return self.get_result()
except Exception as e:
return json.dumps({'code': 500, 'msg': '%s' % e}, ensure_ascii=False)
def get_result(self, *args):
return '請求成功'
odoo14\custom\estate\controllers\__init__.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from . import controller
odoo14\custom\estate\__init__.py
from . import models
from . import controllers
驗證
服務端控制檯輸出請求引數:
{'arg1': 'value1', 'arg2': 'value2'}
API
Routing
odoo.http.route(route=None, **kw)[原始碼]
修飾器將被修飾的方法標記為請求的處理程式。該方法必須是Controller
子類的一部分
引數:
-
route – 字元或者陣列。將確定哪些http請求將匹配被修飾方法的路由部分。可以是單個字串或字串陣列。有關路由表示式的格式,請參見werkzeug的路由文件(http://werkzeug.pocoo.org/docs/routing/ )。
-
type – 請求型別,可選值:
'http'
、'json'
-
auth –
身份驗證方法的型別,可以是以下型別之一:
user
: 使用者必須經過身份驗證,執行當前請求的使用者,必須具有對應的執行許可權public
: 使用者可能已經過身份驗證,也可能沒有經過身份證驗證。如果沒經過身份驗證,使用共享公共使用者(Public user)執行當前請求。none
: 即使沒有資料庫,該方法也始終處於活動狀態。主要由框架和認證模組使用。請求程式碼沒有任何訪問資料庫的設施,也沒有任何指示當前資料庫或當前使用者的配置。
-
methods – 此路由所應用的一系列http方法。如果未指定,則允許使用所有方法。
-
cors – Access-Control-Allow-Origin cors 指令值
-
csrf (bool) –
是否為該路由開啟CSRF 保護。
預設為
True
。檢視CSRF Protection 獲取更多資訊。
參考連線
https://www.odoo.com/documentation/14.0/zh_CN/developer/reference/addons/http.html