一文帶你吃透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ù)。并且提供了靈活的路由匹配和處理,還支持類型轉(zhuǎn)換和驗證,使你能夠 構建強大和可靠的 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ù)進行類型轉(zhuǎn)換。 如果我們運行示例并訪問 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ā)和調(diào)試 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}")
這個路徑操作裝飾器,除非將這兩個裝飾器調(diào)換一下位置。
2.3路徑參數(shù)高級用法
2.3.1 Pydantic 模型(請求體)作為路徑參數(shù)
在 FastAPI 中,使用 Pydantic 模型作為路徑參數(shù)的優(yōu)勢主要體現(xiàn)在以下幾個方面:
- 類型轉(zhuǎ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
值轉(zhuǎn)換為整數(shù),并將其傳遞給 put_item
函數(shù)的 user_id
參數(shù)。同時,它還會根據(jù) Item
模型的定義,驗證并轉(zhuǎn)換路徑參數(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ù)的詳細內(nèi)容,更多關于FastAPI路徑參數(shù)的資料請關注腳本之家其它相關文章!
相關文章
Python使用Paramiko庫實現(xiàn)SSH管理詳解
paramiko 是一個用于在Python中實現(xiàn)SSHv2協(xié)議的庫,它支持對遠程服務器進行加密的通信,本文主要介紹了如何使用Paramiko庫實現(xiàn)SSH管理,感興趣的小伙伴可以學習一下2023-11-11python爬取網(wǎng)站數(shù)據(jù)保存使用的方法
這篇文章主要介紹了使用Python從網(wǎng)上爬取特定屬性數(shù)據(jù)保存的方法,其中解決了編碼問題和如何使用正則匹配數(shù)據(jù)的方法,詳情看下文2013-11-11Python解決IndexError: list index out of&nb
IndexError是一種常見的異常類型,它通常發(fā)生在嘗試訪問列表(list)中不存在的索引時,錯誤信息“IndexError: list index out of range”意味著你試圖訪問的列表索引超出了列表的實際范圍,所以本文給大家介紹了Python成功解決IndexError: list index out of range2024-05-05Python Sqlite3以字典形式返回查詢結果的實現(xiàn)方法
下面小編就為大家?guī)硪黄狿ython Sqlite3以字典形式返回查詢結果的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10Python爬取網(wǎng)易云歌曲評論實現(xiàn)詞云圖
這篇文章主要為大家介紹了Python爬取網(wǎng)易云歌曲評論實現(xiàn)詞云分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06