Web控制器?

控制器?

控制器需要提供可擴展性,就像 Model 一樣,但不能使用與先決條件相同的機制(可能尚未可用已加載模塊的數據庫)(例如,尚未創建數據庫或未選擇數據庫)。

因此,控制器提供了自己的擴展機制,與模型的擴展機制分開:

控制器是通過從 Controller 繼承來創建的。路由是通過使用 route() 裝飾器定義的方法來定義的:

class MyController(odoo.http.Controller):
    @route('/some_url', auth='public')
    def handler(self):
        return stuff()

覆蓋 控制器,請從其類中 inherit 并覆蓋相關方法,如果需要,重新公開它們:

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 從公共認證更改為用戶認證(需要登錄)

API?

路由?

@odoo.http.route(route=None, **routing)[源代碼]?

裝飾控制器方法,以便將匹配給定 URL 和選項的傳入請求路由到裝飾方法。

警告

在控制器擴展中重寫任何方法時,必須重新裝飾該方法,但可以省略參數。請參見 Controller 了解更多詳情。

參數
  • route (Union[str, Iterable[str]]) – 裝飾方法提供的路徑。與此路由匹配的傳入HTTP請求路徑將被路由到此裝飾方法。有關路由表達式的格式,請參見 `werkzeug路由文檔<http://werkzeug.pocoo.org/docs/routing/>`_。

  • type (str) – 請求類型,可以是 'json''http' 。它描述了請求參數的位置以及如何序列化響應。

  • auth (str) – 身份驗證方法,以下之一: * 'user' :用戶必須經過身份驗證,當前請求將使用用戶的權限執行。* 'public' :用戶可能已經經過身份驗證,也可能沒有。如果沒有,當前請求將使用共享的公共用戶執行。* 'none' :該方法始終處于活動狀態,即使沒有數據庫。主要由框架和身份驗證模塊使用。請求代碼將沒有任何訪問當前用戶的功能。

  • methods (Iterable[str]) – 此路由適用的 HTTP 方法(動詞)列表。如果未指定,則允許所有方法。

  • cors (str) – Access-Control-Allow-Origin cors 指令的值。

  • csrf (bool) – 是否為該路由啟用 CSRF 保護。對于 'http' 類型的請求,默認啟用;對于 'json' 類型的請求,默認禁用。

請求?

請求對象會在請求開始時自動設置到 odoo.http.request 上。

class odoo.http.Request(httprequest)[源代碼]?

將傳入的HTTP請求進行包裝,包括反序列化的請求參數、會話工具和請求分發邏輯。

update_env(user=None, context=None, su=None)[源代碼]?

更新當前請求的環境。

參數
  • user (int or res.users record) – 可選的用戶/用戶ID,用于更改當前用戶

  • context (dict) – 可選的上下文字典,用于更改當前上下文

  • su (bool) – 可選布爾值,用于更改超級用戶模式

update_context(**overrides)[源代碼]?

使用 overrides 的值覆蓋當前請求的環境上下文。如果要替換整個上下文,請使用 update_env() 。

property geoip?

獲取遠程地址地理定位信息。

當地理定位成功時,返回值是一個字典,其格式為:

{‘city’: str, ‘country_code’: str, ‘country_name’: str,

‘latitude’: float, ‘longitude’: float, ‘region’: str, ‘time_zone’: str}

當地理定位失敗時,將返回一個空字典。

csrf_token(time_limit=None)[源代碼]?

為當前會話生成并返回CSRF令牌

參數

time_limit (Optional[int]) – CSRF令牌應該只在指定的時間內有效(以秒為單位),默認為48小時, None 表示令牌在當前用戶會話期間有效。

返回

ASCII令牌字符串

返回類型

str

validate_csrf(csrf)[源代碼]?

給定的 CSRF 令牌是否有效?

參數

csrf (str) – 需要驗證的令牌。

返回

當有效時為 True ,無效時為 False 。

返回類型

bool

default_lang()[源代碼]?

根據請求規范返回默認用戶語言

返回

如果指定了首選語言,則使用該語言,否則使用’en_US’

返回類型

str

get_http_params()[源代碼]?

從查詢字符串和請求體中的表單(包括application/x-www-form-urlencoded和multipart/form-data)中提取鍵值對。

返回

合并后的鍵值對。

返回類型

dict

make_response(data, headers=None, cookies=None, status=200)[源代碼]?

用于非 HTML 響應或帶有自定義響應頭或 cookie 的 HTML 響應的輔助工具。

雖然處理程序可以返回要發送的頁面的HTML標記作為字符串,但如果返回非HTML數據,則需要創建完整的響應對象,否則客戶端將無法正確解釋返回的數據。

參數
  • data (str) – 響應正文

  • status (int) – HTTP狀態碼

  • headers ([(name, value)]) – 設置在響應中的HTTP頭

  • cookies (collections.abc.Mapping) – 要設置在客戶端的cookie

返回

一個響應對象。

返回類型

Response

make_json_response(data, headers=None, cookies=None, status=200)[源代碼]?

JSON響應的輔助程序,它將 data 進行JSON序列化,并在未提供Content-Type標頭的情況下設置相應的標頭。

參數
  • data – 將被序列化為 JSON 格式并作為響應主體返回的數據

  • status (int) – HTTP狀態碼

  • headers (List[(str, str)]) – 設置在響應中的HTTP頭

  • cookies (collections.abc.Mapping) – 要設置在客戶端的cookie

返回類型

Response

not_found(description=None)[源代碼]?

快捷方式,用于返回 HTTP 404 (未找到) 響應。

render(template, qcontext=None, lazy=True, **kw)[源代碼]?

QWeb模板的惰性渲染。

給定模板的實際渲染將在分派結束時發生。同時,模板和/或qcontext可以被修改甚至替換為靜態響應。

參數
  • template (str) – 要渲染的模板

  • qcontext (dict) – 使用的渲染上下文

  • lazy (bool) – 是否應該將模板渲染推遲到最后可能的時刻

  • kw (dict) – 轉發到werkzeug的響應對象

class odoo.http.JsonRPCDispatcher(request)[源代碼]?
classmethod is_compatible_with(request)[源代碼]?

確定當前請求是否與此調度程序兼容。

dispatch(endpoint, args)[源代碼]?

JSON-RPC 2 通過HTTP傳輸。

我們的實現在兩個方面與規范不同:

  1. JSON-RPC請求有效載荷的 method 成員被忽略,因為HTTP路徑已經用于將請求路由到控制器。

  2. 我們僅支持按名稱的參數結構,即 JSON-RPC 請求有效載荷的 params 成員必須是 JSON 對象而不是 JSON 數組。

此外,還可以通過一個特殊的 context 參數傳遞上下文,以替換會話上下文,在調用端點之前將其刪除。

請求成功:

--> {"jsonrpc": "2.0", "method": "call", "params": {"context": {}, "arg1": "val1" }, "id": null}

<-- {"jsonrpc": "2.0", "result": { "res1": "val1" }, "id": null}

請求產生錯誤:

--> {"jsonrpc": "2.0", "method": "call", "params": {"context": {}, "arg1": "val1" }, "id": null}

<-- {"jsonrpc": "2.0", "error": {"code": 1, "message": "End user error message.", "data": {"code": "codestring", "debug": "traceback" } }, "id": null}
handle_error(exc: Exception) collections.abc.Callable[源代碼]?

處理將請求分派到 type='json' 路由時發生的任何異常。還處理在請求路徑沒有匹配到路由、無法提供回退頁面和請求的 Content-Type 為 json 時發生的異常。

參數

exc – 發生的異常。

返回

一個 WSGI 應用程序

class odoo.http.HttpDispatcher(request)[源代碼]?
classmethod is_compatible_with(request)[源代碼]?

確定當前請求是否與此調度程序兼容。

dispatch(endpoint, args)[源代碼]?

執行與HTTP相關的操作,例如反序列化請求正文和查詢字符串,檢查CORS/CSRF,同時將請求分派到 type='http' 路由。

請參考 load() 方法,了解兼容的端點返回類型。

handle_error(exc: Exception) collections.abc.Callable[源代碼]?

處理將請求分派到“type =’http’”路由時發生的任何異常。還處理在請求路徑沒有匹配的路由,無法提供回退頁面并且請求“Content-Type”不是json時發生的異常。

參數

exc (Exception) – 發生的異常。

返回

一個 WSGI 應用程序

回應?

class odoo.http.Response(*args, **kw)[源代碼]?

具有正文、狀態、標頭和QWeb支持的出站HTTP響應。除了 werkzeug.wrappers.Response 參數外,此類的構造函數還可以使用以下附加參數進行QWeb懶惰渲染。

參數
  • template (str) – 要渲染的模板

  • qcontext (dict) – 使用的渲染上下文

  • uid (int) – 用于 ir.ui.view 渲染調用的用戶 ID, None 表示使用請求的用戶(默認)

這些屬性可以作為 Response 對象的參數使用,并且在渲染之前隨時可以進行修改。

同時還公開了 werkzeug.wrappers.Response 的所有屬性和方法。

classmethod load(result, fname='<function>')[源代碼]?

將端點的返回值轉換為響應。

參數
返回

已創建的 Response 。

返回類型

Response

引發

TypeError – 當 result 類型不屬于上述類型之一時。

render()[源代碼]?

渲染響應的模板,返回結果。

flatten()[源代碼]?

強制渲染響應的模板,將結果設置為響應正文并取消 template

設置一個cookie。參數與Python標準庫中的cookie Morsel 對象相同,但它也接受Unicode數據。

如果cookie頭的大小超過了 max_cookie_size ,則會發出警告,但是頭部仍將被設置。

參數
  • key – 要設置的cookie的鍵(名稱)。

  • value – cookie的值。

  • max_age – 應該是一個秒數,或者 None (默認值),如果 cookie 只應該持續客戶端瀏覽器會話的時間。

  • expires – 應該是一個 datetime 對象或UNIX時間戳。

  • path – 限制 cookie 的路徑,如果沒有指定,默認會覆蓋整個域名。

  • domain – 如果您想設置跨域cookie。例如, domain=".example.com" 將設置一個可由域名 www.example.com 、 foo.example.com 等讀取的cookie。否則,cookie將只能被設置它的域名讀取。

  • secure – 如果為 True ,則該 cookie 只能通過 HTTPS 訪問

  • httponly – 禁止JavaScript訪問cookie。這是cookie標準的擴展,可能不被所有瀏覽器支持。

  • samesite – 限制 cookie 的范圍,只有在請求是“同站點”時才會附加到請求中。