fastapi/docs/zh-hant/docs/advanced/using-request-directly.md

2.2 KiB
Raw Blame History

直接使用 Request

到目前為止,你都是用對應的型別來宣告你需要的請求各部分。

例如從以下來源取得資料:

  • 路徑中的參數。
  • 標頭。
  • Cookies。
  • 等等。

這麼做時FastAPI 會自動驗證並轉換這些資料,還會為你的 API 產生文件。

但有些情況你可能需要直接存取 Request 物件。

關於 Request 物件的細節

由於 FastAPI 底層其實是 Starlette再加上一層工具因此在需要時你可以直接使用 Starlette 的 Request 物件。

同時也代表,如果你直接從 Request 物件取得資料(例如讀取 bodyFastAPI 不會替它做驗證、轉換或文件化(透過 OpenAPI 為自動化的 API 介面產生文件)。

不過,其他以一般方式宣告的參數(例如以 Pydantic 模型宣告的 body仍然會被驗證、轉換、加上標註等。

但在某些特定情境下,直接取得 Request 物件會很實用。

直接使用 Request 物件

假設你想在你的 路徑操作函式path operation function 中取得用戶端的 IP 位址/主機。

為此,你需要直接存取請求。

{* ../../docs_src/using_request_directly/tutorial001_py310.py hl[1,7:8] *}

只要在 路徑操作函式 中宣告一個型別為 Request 的參數FastAPI 就會將當前的 Request 傳入該參數。

/// tip

注意在這個例子中,除了 request 參數之外,我們也宣告了一個路徑參數。

因此,路徑參數會被擷取、驗證、轉換為指定型別,並在 OpenAPI 中加入標註。

同理,你可以照常宣告其他參數,並另外同時取得 Request

///

Request 文件

你可以在 Starlette 官方文件站點中的 Request 物件 了解更多細節。

/// note | 技術細節

你也可以使用 from starlette.requests import Request

FastAPI 之所以直接提供它,是為了讓開發者更方便;但它本身是來自 Starlette。

///