odoo Web Controllers 學習總結

授客發表於2023-03-04

環境

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