一文帶你吃透FastAPI中的路徑參數(shù)
一、前言
FastAPI 最核心的之一就是路徑參數(shù),今天我們一篇徹底搞 FaST 懂路徑參數(shù)
二、路徑參數(shù)定義
路徑操作裝飾器中對應的值就是路徑參數(shù),比如:
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello/{name}")
def say_hello(name: str):
return {"message": f"Hello {name}"}
if __name__ == "__main__":
import uvicorn
uvicorn.run("quickstart.demo:app",reload=True,port=8001)
路徑操作裝飾器 @app.get("/hello/{name}") 中 name 就是路徑參數(shù),這里我們也把路徑參數(shù) name 的值作為參數(shù) name 傳遞給了路徑操作函數(shù) say_hello,如果我們運行示例并訪問 http://127.0.0.1:8001/hello/xiaoming,將會看到如下響應:
{"message":"Hello xiaoming"}
2.1 路徑參數(shù)作用
路徑參數(shù)在 FastAPI 中的主要作用是從 URL 路徑中提取變量值,并將其傳遞給請求處理函數(shù)。并且提供了靈活的路由匹配和處理,還支持類型轉換和驗證,使你能夠 構建強大和可靠的 API
2.2 路徑參數(shù)的基本使用
2.2.1 無類型的路徑參數(shù)
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id):
return {"item_id": item_id}
if __name__ == "__main__":
import uvicorn
uvicorn.run("quickstart.demo:app",reload=True,port=8001)
如果我們運行示例并訪問 http://127.0.0.1:8001/items/xiaoming,將會看到如下響應:
{"item_id": "xiaoming"}
如果我們運行示例并訪問 http://127.0.0.1:8001/items/11,將會看到如下響應:
{"item_id":"11"}
所以當路徑參數(shù)是無類型時,F(xiàn)astAPI 會將其認為為 str 類型
2.2.2有類型的路徑參數(shù)
為函數(shù)中的與路徑參數(shù)同名的參數(shù)聲明類型
比如申明函數(shù)中 item_id 為 int 類型
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id:int):
return {"item_id": item_id}
if __name__ == "__main__":
import uvicorn
uvicorn.run("quickstart.demo:app",reload=True,port=8001)
如果我們運行示例并訪問 http://127.0.0.1:8001/items/11,將會看到如下響應:
{"item_id":11}
注意函數(shù)接收(并返回)的值為 11,是一個 Python int 值,而不是字符串 "11"。 所以,F(xiàn)astAPI 通過上面的類型可以對參數(shù)進行類型轉換。 如果我們運行示例并訪問 http://127.0.0.1:8001/items/xiaoming,將會看到如下響應:
{
"detail":[
{
"loc":[
"path",
"item_id"
],
"msg":"value is not a valid integer",
"type":"type_error.integer"
}
]
}
因為路徑參數(shù) item_id 傳入的值為 "xiaoming",它不是一個 int。 如果你提供的是 float 而非整數(shù)也會出現(xiàn)同樣的錯誤,比如:http://127.0.0.1:8001/items/11.1 所以,通過同樣的 Python 類型聲明,F(xiàn)astAPI 提供了數(shù)據(jù)校驗功能。并且清楚地指出了校驗未通過的具體原因。在開發(fā)和調試 API 時,這非常有用。
為路徑參數(shù)申明類型
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id:int}")
def read_item(item_id):
return {"item_id": item_id}
if __name__ == "__main__":
import uvicorn
uvicorn.run("quickstart.demo:app",reload=True,port=8001)
如果我們運行示例并訪問 http://127.0.0.1:8001/items/11,將會看到如下響應:
{"item_id":11}
如果我們運行示例并訪問 http://127.0.0.1:8001/items/xiaoming,將會看到如下響應:
{"detail":"Not Found"}
上一篇文章中,我們講過 @app.get("/items/{item_id:int}") 為 **路徑操作裝飾器,它的作用就是匹配 URL ,**而傳給 FastAPI 的 URL 為 /items/xiaoming,它應該匹配 @app.get("/items/{item_id:str}") 或者 @app.get("/items/{item_id}"),但代碼中并沒有這兩個地址,所以瀏覽器會返回 Not Found,而服務端也就是我們的 Code 打印出來的日志為 127.0.0.1:64512 - "GET /items/xiaoming HTTP/1.1" 404 Not Found 想要修復這個錯誤其實也很容易,我們再加一個 @app.get("/items/{item_id:str}") 路徑操作裝飾器即可
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id:int}")
def read_item(item_id):
return {"item_id": item_id}
@app.get("/items/{item_id:str}")
def read_item(item_id):
return {"item_id": item_id}
if __name__ == "__main__":
import uvicorn
uvicorn.run("quickstart.demo:app",reload=True,port=8001)
2.2.3 路徑參數(shù)順序
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id):
return {"item_id": item_id}
@app.get("/items/{item_id:int}")
def read_item(item_id):
return {"item_id_int": item_id}
if __name__ == "__main__":
import uvicorn
uvicorn.run("quickstart.demo:app",reload=True,port=8001)
如果我們運行示例并訪問http://127.0.0.1:8001/items/11,將會看到如下響應:
{"item_id":"11"}
如果我們運行示例并訪問 http://127.0.0.1:8001/items/xiaoming,將會看到如下響應:
{"item_id":"xiaoming"}
會發(fā)現(xiàn),不管怎么樣都沒有辦法訪問 @app.get("/items/{item_id:int}") 這個路徑操作裝飾器,除非將這兩個裝飾器調換一下位置。
2.3路徑參數(shù)高級用法
2.3.1 Pydantic 模型(請求體)作為路徑參數(shù)
在 FastAPI 中,使用 Pydantic 模型作為路徑參數(shù)的優(yōu)勢主要體現(xiàn)在以下幾個方面:
- 類型轉換和驗證:通過使用 Pydantic 模型作為路徑參數(shù),你可以指定參數(shù)的類型,并利用 Pydantic 的驗證規(guī)則來確保傳入的參數(shù)值符合預期的格式和約束。這可以防止無效的參數(shù)值傳遞到請求處理函數(shù)中,提高了數(shù)據(jù)的有效性和安全性。
- 自動生成文檔和 OpenAPI 規(guī)范:FastAPI 使用 Pydantic 模型作為路徑參數(shù)時,能夠自動根據(jù)模型的定義生成路徑參數(shù)的文檔和 OpenAPI 規(guī)范。這樣,你不僅可以確保文檔與實際代碼保持同步,還可以獲得更詳細和準確的文檔信息,包括參數(shù)類型、驗證規(guī)則和示例值等。
- 代碼重用和可維護性:使用 Pydantic 模型作為路徑參數(shù)可以提高代碼的重用性和可維護性。你可以在多個路由中使用相同的模型作為路徑參數(shù),避免了重復定義和驗證參數(shù)的過程。這樣,如果需要更改參數(shù)的類型或驗證規(guī)則,你只需要修改模型的定義,而不必在多個地方修改代碼。
- 更清晰的代碼結構:通過使用 Pydantic 模型作為路徑參數(shù),可以使代碼結構更清晰和可讀。模型的定義提供了一種統(tǒng)一的方式來描述和組織參數(shù),使得代碼更易于理解和維護。
以下是一個示例:
Server 端:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
item_id: int
item_name: str
@app.put("/items/{item_id}")
def put_item(item_id:int,item_name:str):
return {"item_id": item_id, "item_name":item_name}
if __name__ == "__main__":
import uvicorn
uvicorn.run("quickstart.demo:app", reload=True, port=8001)
Client端:
import requests
data={"item_id":1,"item_name":"xiaoming"}
respone=requests.put("http://127.0.0.1:8001/items/1",json=data)
print(respone.json())
respone的結果:
{'item_id': 1, 'item_name': 'xiaoming'}
在上述示例中,我們定義了一個 Item 模型作為路徑參數(shù),并且還定義了另一個 user_id 的普通路徑參數(shù)。FastAPI 會自動將路徑參數(shù)中的 user_id 值轉換為整數(shù),并將其傳遞給 put_item 函數(shù)的 user_id 參數(shù)。同時,它還會根據(jù) Item 模型的定義,驗證并轉換路徑參數(shù)中的 JSON 對象,并將其傳遞給 put_item 函數(shù)的 item 參數(shù)。
2.3.2 路徑參數(shù)校驗
因為是路徑參數(shù),所以需要使用 FastPAI 的 Path 模塊來進行參數(shù)的校驗
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id:int=Path(gt=0, le=100)):
return {"item_id": item_id}
if __name__ == "__main__":
import uvicorn
uvicorn.run("quickstart.demo:app",reload=True,port=8001)
這個例子當中,我們限制了 item_id 取值范圍為 [0,100] 如果我們運行示例并訪問 http://127.0.0.1:8001/items/11,將會看到如下響應:
{"item_id":"11"}
訪問 http://127.0.0.1:8001/items/101 ,將會看到如下響應:
{
"detail":[
{
"loc":[
"path",
"item_id"
],
"msg":"ensure this value is less than or equal to 100",
"type":"value_error.number.not_le",
"ctx":{
"limit_value":100
}
}
]
}
類似操作還有很多,比如:
數(shù)字:
gt:大于
ge:大于等于
lt:小于
le:小于等于
字符串:
min_length
max_length
pattern 正則表達式
如果使用 Pydantic 模型作為路徑參數(shù),也可以進行類似的校驗,如:
class Item(BaseModel):
name: str
price: float = Path(gt=0.1, le=100.2)
2.3.3 路徑參數(shù)申明元數(shù)據(jù)
在 FastAPI 中,路徑參數(shù)的元數(shù)據(jù)用于提供關于該參數(shù)的額外信息,例如描述、示例值、別名等。這些元數(shù)據(jù)可以通過在路徑參數(shù)聲明中使用參數(shù)關鍵字參數(shù)的方式進行設置。使用元數(shù)據(jù)可以提高代碼的可讀性和維護性。
FastAPI 使用元數(shù)據(jù)來生成自動化的文檔,包括 API 文檔和交互式 API 文檔(Swagger UI 或 ReDoc)。元數(shù)據(jù)提供了關于路徑參數(shù)的描述、示例值和其他信息,使生成的文檔更加詳細和準確。這樣,用戶可以在文檔中了解到如何正確使用路徑參數(shù)。
下面是一個示例,展示了在 FastAPI 中使用路徑參數(shù)元數(shù)據(jù)的方式:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id:int=Path(description="item的ID,規(guī)定其值大于0,小于等于100",gt=0, le=100)):
return {"item_id": item_id}
if __name__ == "__main__":
import uvicorn
uvicorn.run("quickstart.demo:app",reload=True,port=8001)
這樣的話,在跟上下游對接的過程中,如果還有人問你 item_id 是啥意思,直接甩一個鏈接 http://127.0.0.1:8001/docs 到他臉上,因為文檔中有詳細的信息,如:

以上就是一文帶你吃透FastAPI中的路徑參數(shù)的詳細內容,更多關于FastAPI路徑參數(shù)的資料請關注腳本之家其它相關文章!
相關文章
Python使用Paramiko庫實現(xiàn)SSH管理詳解
paramiko 是一個用于在Python中實現(xiàn)SSHv2協(xié)議的庫,它支持對遠程服務器進行加密的通信,本文主要介紹了如何使用Paramiko庫實現(xiàn)SSH管理,感興趣的小伙伴可以學習一下2023-11-11
Python解決IndexError: list index out of&nb
IndexError是一種常見的異常類型,它通常發(fā)生在嘗試訪問列表(list)中不存在的索引時,錯誤信息“IndexError: list index out of range”意味著你試圖訪問的列表索引超出了列表的實際范圍,所以本文給大家介紹了Python成功解決IndexError: list index out of range2024-05-05
Python Sqlite3以字典形式返回查詢結果的實現(xiàn)方法
下面小編就為大家?guī)硪黄狿ython Sqlite3以字典形式返回查詢結果的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10

