1. 程式人生 > 其它 >odoo開發教程十二:web controlle

odoo開發教程十二:web controlle

一:路由

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

route -- 字串或陣列,決定哪個http請求匹配所裝飾的方法,可以是單個字串、或多個字串的陣列
type -- 請求的型別,可以是http或json
auth -- 認證方法的型別,可以是以下幾種:
    user - 必須是認證的使用者,該請求基於已認證的使用者
    public - 當不通過認證訪問時使用公用的認證
    none - 相應的方法總是可用,一般用於框架和認證模組,對應請求沒有辦法訪問資料庫或指向資料庫的設定
methods 這個請求所應用的一系列http方法,如果沒指定則是所有方法
cors 跨域資源cors引數
csrf(boolean) 是否開啟CSRF保護,預設True
1.如果表單是用python程式碼生成的,可通過request.csrf_token() 獲取csrf
2.如果表單是用javascript生成的,CSRF token會自動被新增到QWEB環境變數中,通過require('web.core').csrf_token使用
3.如果終端可從其他地方以api或webhook形式呼叫,需要將對應的csrf禁用,此時最好用其他方式進行驗證

二:請求

請求物件在收到請求時自動設定到odoo.http.request。

class odoo.http.WebRequest(httprequest)

所有odoo WEB請求的父類,一般用於進行請求物件的初始化:

httprequest 原始的werkzeug.wrappers.Request物件
params 請求引數的對映
cr 當前方法呼叫的初始遊標,當使用none的認證方式時讀取遊標會報錯
context 當前請求的上下文鍵值對映
env 繫結到當前請求的環境
session 儲存當前請求session資料的OpenERPSession
debug 指定當前請求是否是debug模式
db 當前請求所關聯的資料庫,當使用none認證時為None
csrf_token(time_limit=3600) 為該請求生成並返回一個token(引數以秒計算,預設1小時,如果傳None表示與當前使用者session時間相同)

class odoo.http.HttpRequest(*args)

用於處理http型別請求的函式,匹配路由引數、查詢引數、表格引數,如果有指定檔案也會傳給該方法。為防止重名,路由引數優先順序最高。
該函式的返回有三種:

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

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

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

引數:
data (basestring) -- 響應主體
headers ([(name, value)]) -- http響應頭
cookies (collections.Mapping) -- 傳送給客戶端的cookie

not_found(description=None)

給出404 NOT FOUND響應

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

渲染qweb模板,在排程完成後會對給定的模板進行渲染:

引數:
template (basestring) -- 用於渲染的模板
qcontext (dict) -- 用於渲染的上下文環境
lazy (bool) -- 渲染動作是否應該拖延到最後執行
kw -- 轉發到werkzeug響應物件

class odoo.http.JsonRequest(*args)

處理通過http發來的json rpc格式請求:

說明:
1.method -- 忽略
2.params -- 須是一個json格式物件
3.處理方法返回的結果是一個json-rpc格式的,以JSON-RPC Response物件的形式組裝

三:響應

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

響應物件通過控制器的路由傳遞,在werkzeug.wrappers.Response之外,該類的構造方法會新增以下引數到qweb的渲染中:

template (basestring) -- 用於渲染的模板
qcontext (dict) -- 用在渲染中的上下文環境
uid (int) -- 用於呼叫ir.ui.view渲染的使用者id,None時使用當前請求的id

上面的引數在實際渲染之前可以隨時作為Response物件的屬性修改

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

四:控制器

一般通過繼承的形式建立:class odoo.http.Controller

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

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