Odoo Controller詳解


轉載請注明原文地址:https://www.cnblogs.com/ygj0930/p/10826241.html

一:Controller

    一般通過繼承的形式來創建controller類,繼承自odoo.http.Controller。

    以route裝飾器來裝飾定義的方法,提供url路由訪問路徑:

class MyController(odoo.http.Controller)://繼承controller定義控制器
    @route('/some_url', auth='public')//裝飾器路由訪問方法,並指明訪問方式:公開還是需要用戶登陸
    def handler(self):
        return stuff()

 

二:路由映射相關

    odoo.http.route(route=None, **kw) 裝飾器可以將對應方法裝飾為處理對應的http請求。

    裝飾器參數有:

    1)route

    字符串或數組,決定哪些http請求可以匹配所裝飾的方法,可以是單個字符串、或多個字符串的數組

    2)type

    請求的類型,可以是http或json

    3)auth

    認證方法的類型,可以是以下幾種:

        user - 必須是已通過登錄認證的用戶,才能訪問該請求。如果未經過登錄直接訪問,則會攔截並跳轉回odoo登錄頁面。

        public - 使用公用的認證,可以不經過登錄驗證直接訪問。

        none - 相應的方法總是可用,一般用於框架和認證模塊,對應請求沒有辦法訪問數據庫或指向數據庫的設置。

    4)methods

    這個請求所應用的一系列http方法【PATCH, POST, PUT, 或者DELETE】,如果沒指定則是所有方法。

 methods=['POST', 'GET']

    5)cors

    跨域資源cors參數。

    6)csrf(boolean)

    是否開啟CSRF跨域保護,默認True。

        a)如果表單是用python代碼生成的,可通過request.csrf_token() 獲取csrf

        b)如果表單是用javascript生成的,CSRF token會自動被添加到QWEB環境變量中,通過require('web.core').csrf_token獲取

        c)如果終端可從其他地方以api或webhook形式調用,需要將對應的csrf禁用,此時最好用其他方式進行驗證

 

三:請求相關

    請求對象在收到請求時自動設置到odoo.http.request,可以通過該對象提前request中攜帶的 參數、cookie、session對象等。

   跟請求相關的類和函數有以下幾種:

   1:class odoo.http.WebRequest(httprequest)

   所有odoo WEB請求的父類,一般用於進行請求對象的初始化,其構建函數的參數有:

    1)httprequest

    原始的werkzeug.wrappers.Request對象

    2)params

    請求參數的映射

    3)cr

    當前方法調用的初始游標,當使用none的認證方式時讀取游標會報錯

    4)context

    當前請求的上下文鍵值映射

    5)env

    綁定到當前請求的環境

    6)session

    儲存當前請求session數據的OpenERPSession

    7)debug

    指定當前請求是否是debug模式

    8)db

    當前請求所關聯的數據庫,當使用none認證時為None

    9)csrf_token(time_limit=3600)

    為該請求生成並返回一個token(參數以秒計算,默認1小時,如果傳None表示與當前用戶session時間相同)

 

    2:class odoo.http.HttpRequest(*args)

    用於處理http類型請求的函數,匹配 路由參數、查詢參數、表格參數,如果有指定文件也會傳給該方法。為防止重名,路由參數優先級最高。
    該函數的返回值有三種:

    • 無效值,HTTP響應會返回一個204(沒有內容)
    • 一個werkzeug 響應對象
    • 一個字符串或unicode,會被響應對象包裝並使用HTML解析

 

    3:make_response(data, headers=None, cookies=None)

    用於生成沒有HTML的響應 或 自定義響應頭、cookie的html響應。
    由於處理函數只以字符串形式返回html標記內容,需要組成一個完整的響應對象,這樣客戶端才能解析

    參數有:

    1)data (basestring)

    響應主體。

    2)headers ([(name, value)])

    http響應頭。

    3)cookies (collections.Mapping)

    發送給客戶端的cookie。

 

    4:not_found(description=None)

    給出404 NOT FOUND響應。

 

    5:render(template, qcontext=None, lazy=True, **kw)

    渲染qweb模板,在調度完成后會對給定的模板進行渲染並返回給客戶端。

    參數有:

    1)template (basestring)

    用於渲染的模板完整ID:模塊.模版

    2)qcontext (dict)

    用於渲染的上下文環境。

    3)lazy (bool)

   渲染動作是否應該拖延到最后執行。

    4)kw

    轉發到werkzeug響應對象。

 

    6:class odoo.http.JsonRequest(*args)

    處理通過http發來的json rpc請求。

    參數:params -- 是一個json格式對象

    返回值:一個json-rpc格式的,以JSON-RPC Response對象的組裝。

 

四:響應相關

    1:class odoo.http.Response(args, *kw)

    響應對象通過控制器的路由傳遞,在werkzeug.wrappers.Response之外,該類的構造方法會添加以下參數到qweb的渲染中:

    1)template (basestring)

    用於渲染的模板。

    2)qcontext (dict)

    用在渲染中的上下文環境。

    3)uid (int)

    用於調用ir.ui.view渲染的用戶id,None時使用當前請求的id。

    上面的參數在實際渲染之前可以隨時作為Response對象的屬性進行修改。

 

    response對象可以調用以下方法:

    • render() - 渲染響應對象的模板,並返回內容。
    • flatten() - 強制渲染響應對象的模板,將結果設置為響應主體,並將模板復原。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM