Skip to content

直接使用 Request

🌐 AI 與人類共同完成的翻譯

此翻譯由人類指導的 AI 完成。🤝

可能會有對原意的誤解,或讀起來不自然等問題。🤖

你可以透過協助我們更好地引導 AI LLM來改進此翻譯。

英文版

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

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

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

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

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

關於 Request 物件的細節

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

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

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

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

直接使用 Request 物件

假設你想在你的 路徑操作函式(path operation function) 中取得用戶端的 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 傳入該參數。

Tip

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

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

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

Request 文件

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

技術細節

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

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