demo
from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"message": "Hello World"}
在終端運行
fastapi dev main.py
結果如下:
打開http://127.0.0.1:8000:
交互式API文檔:位于http://127.0.0.1:8000/docs
可選的API文檔:位于http://127.0.0.1:8000/redoc
路徑參數
FastAPI 支持使用 Python 字符串格式化語法聲明路徑參數(變量)
from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
async def read_item(item_id):return {"item_id": item_id}
這段代碼把路徑參數 item_id 的值傳遞給路徑函數的參數 item_id
路徑有順序之分。例如要使用 /users/me 獲取當前用戶的數據。然后還要使用 /users/{user_id},通過用戶 ID 獲取指定用戶的數據。
由于路徑操作是按順序依次運行的,因此,一定要在 /users/{user_id} 之前聲明 /users/me
預設值
路徑操作可以使用 Python 的 Enum 類型接收預設的路徑參數
class ModelName(str, Enum):# 多重繼承,繼承str和Enumalexnet = "alexnet"resnet = "resnet"lenet = "lenet"
包含路徑的路徑參數
在結尾加上:path表示匹配的是路徑
from fastapi import FastAPIapp = FastAPI()@app.get("/files/{file_path:path}")
async def read_file(file_path: str):return {"file_path": file_path}
查詢參數
聲明的參數不是路徑參數時,路徑操作函數會把該參數自動解釋為查詢參數。
可選參數
from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str | None = None, short: bool = False):item = {"item_id": item_id}if q:item.update({"q": q})if not short:item.update({"description": "This is an amazing item that has a long description"})return item
將參數默認值設為None即聲明可選參數.不聲明默認值均為必選參數
布爾類型參數
FastAPI 會按照以下規則進行轉換:
轉換為 True 的值:
“true” (不區分大小寫)
“True”
“TRUE”
“1”
“yes”
“on”
轉換為 False 的值:
“false” (不區分大小寫)
“False”
“FALSE”
“0”
“no”
“off”
參數不存在時 (使用默認值 False)
from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str | None = None, short: bool = False):item = {"item_id": item_id}if q:item.update({"q": q})if not short:item.update({"description": "This is an amazing item that has a long description"})return item
多個路徑和查詢參數
FastAPI 可以識別同時聲明的多個路徑參數和查詢參數。而且聲明查詢參數的順序并不重要。
FastAPI 通過參數名進行檢測:
from fastapi import FastAPIapp = FastAPI()@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(user_id: int, item_id: str, q: str | None = None, short: bool = False
):item = {"item_id": item_id, "owner_id": user_id}if q:item.update({"q": q})if not short:item.update({"description": "This is an amazing item that has a long description"})return item
訪問:http://127.0.0.1:8000/users/1/items/4?q=4&short=0