FastAPI Response Headers 與 Cookies
除了資料內容 (Body) 之外,你可能還需要透過 Header 或 Cookie 傳遞額外資訊給客戶端,例如分頁資訊、追蹤 ID 或 Session。
設定 Response Header
要加入自訂 Header,你可以在路徑操作函數中,宣告一個 Response 型別的參數。
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/items/")
async def read_items(response: Response):
# 使用 .headers 加入自訂標頭
response.headers["X-Process-ID"] = "abcd-1234"
return {"message": "Success"}
當你存取這個 API 時,回應的 Header 中就會包含 X-Process-ID: abcd-1234。
設定 Cookie
你可以使用 response.set_cookie() 方法來設定 Cookie。
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/login/")
async def login(response: Response):
# 設定一個名稱為 ads_id 的 Cookie
response.set_cookie(key="ads_id", value="12345678")
return {"message": "Logged in"}
set_cookie 完整參數介紹
response.set_cookie() 支援許多參數來精確控制 Cookie 的行為:
| 參數 | 說明 |
|---|---|
key | Cookie 的名稱。 |
value | Cookie 的值。 |
max_age | 有效期限,以秒為單位(例如 3600 為一小時)。 |
expires | 過期時間,傳入 datetime 物件或日期字串。 |
path | Cookie 的有效路徑,預設為 /。只有在此路徑及其子路徑下的請求才會帶上此 Cookie。 |
domain | Cookie 的有效網域。 |
secure | 設定為 True 時,僅允許在 HTTPS 安全連線下傳送。 |
httponly | 設定為 True 時,禁止客戶端 JavaScript 存取此 Cookie (防止 XSS 攻擊)。 |
samesite | 控制跨站請求行為,可選值為 'lax' (預設), 'strict', 'none' (需搭配 secure=True)。 |
partitioned | 設定為 True 時,啟用獨立分區狀態 (CHIPS),用於處理第三方 Cookie 的隱私限制。 |
安全設定範例:
response.set_cookie(
key="session_id",
value="secret-session-key",
httponly=True,
secure=True,
max_age=3600,
samesite="lax"
)
刪除 Cookie (Delete Cookie)
如果你想撤銷或刪除客戶端上的 Cookie (例如在「登出」功能中),可以使用 response.delete_cookie() 方法。
@app.post("/logout")
async def logout(response: Response):
# 刪除名稱為 session_id 的 Cookie
response.delete_cookie(key="session_id")
return {"message": "Logged out"}
注意:刪除 Cookie 時,如果當初設定時有指定
path 或 domain,則呼叫 delete_cookie 時也必須傳入相同的 path 或 domain 參數,否則瀏覽器可能不會成功刪除。在 HTTPException 中加入 Header
如果你在報錯時也想提供 Header(例如 WWW-Authenticate),可以在 HTTPException 中設定:
from fastapi import HTTPException
raise HTTPException(
status_code=401,
detail="Unauthorized",
headers={"X-Error-Code": "AUTH_FAILED"}
)
總結
- 透過在函數中宣告
response: Response物件來操作回應。 - 使用
response.headers["Key"] = "Value"設定 Header。 - 使用
response.set_cookie(...)設定 Cookie。 - 設定偏好安全性的 Cookie 參數 (
httponly,secure) 是最佳實踐。