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_context(**overrides)[源代碼]?
使用
overrides
的值覆蓋當前請求的環境上下文。如果要替換整個上下文,請使用update_env()
。
- property geoip?
獲取遠程地址地理定位信息。
當地理定位成功時,返回值是一個字典,其格式為:
- {‘city’: str, ‘country_code’: str, ‘country_name’: str,
‘latitude’: float, ‘longitude’: float, ‘region’: str, ‘time_zone’: str}
當地理定位失敗時,將返回一個空字典。
- get_http_params()[源代碼]?
從查詢字符串和請求體中的表單(包括application/x-www-form-urlencoded和multipart/form-data)中提取鍵值對。
- 返回
合并后的鍵值對。
- 返回類型
- 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
- 返回
一個響應對象。
- 返回類型
- make_json_response(data, headers=None, cookies=None, status=200)[源代碼]?
JSON響應的輔助程序,它將
data
進行JSON序列化,并在未提供Content-Type標頭的情況下設置相應的標頭。- 參數
data – 將被序列化為 JSON 格式并作為響應主體返回的數據
status (int) – HTTP狀態碼
cookies (collections.abc.Mapping) – 要設置在客戶端的cookie
- 返回類型
- class odoo.http.JsonRPCDispatcher(request)[源代碼]?
-
- dispatch(endpoint, args)[源代碼]?
JSON-RPC 2 通過HTTP傳輸。
我們的實現在兩個方面與規范不同:
JSON-RPC請求有效載荷的
method
成員被忽略,因為HTTP路徑已經用于將請求路由到控制器。我們僅支持按名稱的參數結構,即 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)[源代碼]?
-
- 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懶惰渲染。- 參數
這些屬性可以作為 Response 對象的參數使用,并且在渲染之前隨時可以進行修改。
同時還公開了
werkzeug.wrappers.Response
的所有屬性和方法。- classmethod load(result, fname='<function>')[源代碼]?
將端點的返回值轉換為響應。
- 參數
result (Union[Response, werkzeug.wrappers.BaseResponse, werkzeug.exceptions.HTTPException, str, bytes, NoneType]) – 從端點返回值加載響應。
fname (str) – 記錄日志時使用的結果來源端點函數名稱。
- 返回
已創建的
Response
。- 返回類型
- 引發
TypeError – 當
result
類型不屬于上述類型之一時。
- set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None, cookie_type='required')[源代碼]?
設置一個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 的范圍,只有在請求是“同站點”時才會附加到請求中。