直接使用 Request 物件¶
到目前為止,您一直使用其類型宣告您需要的請求部分。
從以下位置取得資料
- 路徑作為參數。
- 標頭。
- Cookie。
- 等等。
透過這樣做,FastAPI 會自動驗證該資料、轉換它並為您的 API 產生文件。
但在某些情況下,您可能需要直接存取 Request
物件。
關於 Request
物件的詳細資訊¶
由於 FastAPI 實際上是底層的 Starlette,上面有一層多個工具,因此您可以在需要時直接使用 Starlette 的 Request
物件。
這也意味著,如果您直接從 Request
物件取得資料(例如,讀取主體),FastAPI 將不會驗證、轉換或記錄它(使用 OpenAPI,適用於自動 API 使用者介面)。
儘管任何其他正常宣告的參數(例如,具有 Pydantic 模型的主體)仍會被驗證、轉換、註釋等。
但在某些特定情況下,取得 Request
物件會很有用。
直接使用 Request
物件¶
假設您想要在路徑操作函式內取得客戶端的 IP 位址/主機。
為此,您需要直接存取請求。
from fastapi import FastAPI, Request
app = FastAPI()
@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):
client_host = request.client.host
return {"client_host": client_host, "item_id": item_id}
透過宣告類型為 Request
的路徑操作函式參數,FastAPI 將會知道在該參數中傳遞 Request
。
提示
請注意,在這種情況下,我們在請求參數旁邊宣告了一個路徑參數。
因此,路徑參數將會被提取、驗證、轉換為指定的類型,並使用 OpenAPI 進行註釋。
同樣地,您可以正常宣告任何其他參數,並且也可以取得 Request
。
Request
文件¶
您可以在 Starlette 官方文件網站 中閱讀有關 Request
物件的更多詳細資訊。
「技術細節」
您也可以使用 from starlette.requests import Request
。
FastAPI 直接提供它只是為了方便您,開發人員。但它直接來自 Starlette。