回應 - 變更狀態碼¶
你可能已經讀過,可以設定預設的回應狀態碼。
但有些情況你需要回傳與預設不同的狀態碼。
使用情境¶
例如,假設你預設想回傳 HTTP 狀態碼 "OK" 200。
但如果資料不存在,你想要建立它,並回傳 HTTP 狀態碼 "CREATED" 201。
同時你仍希望能用 response_model 過濾並轉換所回傳的資料。
在這些情況下,你可以使用 Response 參數。
使用 Response 參數¶
你可以在你的路徑操作函式(path operation function)中宣告一個 Response 型別的參數(就像你可以對 Cookies 和標頭那樣)。
接著你可以在那個「暫時的」回應物件上設定 status_code。
from fastapi import FastAPI, Response, status
app = FastAPI()
tasks = {"foo": "Listen to the Bar Fighters"}
@app.put("/get-or-create-task/{task_id}", status_code=200)
def get_or_create_task(task_id: str, response: Response):
if task_id not in tasks:
tasks[task_id] = "This didn't exist before"
response.status_code = status.HTTP_201_CREATED
return tasks[task_id]
🤓 Other versions and variants
from fastapi import FastAPI, Response, status
app = FastAPI()
tasks = {"foo": "Listen to the Bar Fighters"}
@app.put("/get-or-create-task/{task_id}", status_code=200)
def get_or_create_task(task_id: str, response: Response):
if task_id not in tasks:
tasks[task_id] = "This didn't exist before"
response.status_code = status.HTTP_201_CREATED
return tasks[task_id]
然後你可以照常回傳任何需要的物件(例如 dict、資料庫模型等)。
若你宣告了 response_model,它仍會被用來過濾並轉換你回傳的物件。
FastAPI 會使用那個「暫時的」回應來取得狀態碼(以及 Cookies 和標頭),並將它們放入最終回應中;最終回應包含你回傳的值,且會被任何 response_model 過濾。
你也可以在相依性(dependencies)中宣告 Response 參數,並在其中設定狀態碼。但請注意,最後被設定的值會生效。