最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你吃透FastAPI中的路徑參數(shù)

 更新時間:2024年03月26日 09:27:02   作者:shengjk1  
FastAPI中最核心的之一就是路徑參數(shù),所以這篇文章小編主要來和大家介紹一下FastAPI路徑參數(shù)的作用以及基本使用,有需要的小伙伴可以參考下

一、前言

FastAPI 最核心的之一就是路徑參數(shù),今天我們一篇徹底搞 FaST 懂路徑參數(shù)

二、路徑參數(shù)定義

路徑操作裝飾器中對應(yīng)的值就是路徑參數(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,將會看到如下響應(yīng):

{"message":"Hello xiaoming"}

2.1 路徑參數(shù)作用

路徑參數(shù)在 FastAPI 中的主要作用是從 URL 路徑中提取變量值,并將其傳遞給請求處理函數(shù)。并且提供了靈活的路由匹配和處理,還支持類型轉(zhuǎn)換和驗證,使你能夠 構(gòu)建強大和可靠的 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,將會看到如下響應(yīng):

{"item_id": "xiaoming"}

如果我們運行示例并訪問 http://127.0.0.1:8001/items/11,將會看到如下響應(yīng):

{"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,將會看到如下響應(yīng):

{"item_id":11}

注意函數(shù)接收(并返回)的值為 11,是一個 Python int 值,而不是字符串 "11"。 所以,F(xiàn)astAPI 通過上面的類型可以對參數(shù)進行類型轉(zhuǎn)換。 如果我們運行示例并訪問 http://127.0.0.1:8001/items/xiaoming,將會看到如下響應(yīng):

{
  "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,將會看到如下響應(yīng):

{"item_id":11}

如果我們運行示例并訪問 http://127.0.0.1:8001/items/xiaoming,將會看到如下響應(yīng):

{"detail":"Not Found"}

上一篇文章中,我們講過 @app.get("/items/{item_id:int}") 為 **路徑操作裝飾器,它的作用就是匹配 URL ,**而傳給 FastAPI 的 URL 為 /items/xiaoming,它應(yīng)該匹配 @app.get("/items/{item_id:str}") 或者 @app.get("/items/{item_id}"),但代碼中并沒有這兩個地址,所以瀏覽器會返回 Not Found,而服務(wù)端也就是我們的 Code 打印出來的日志為 127.0.0.1:64512 - "GET /items/xiaoming HTTP/1.1" 404 Not Found 想要修復(fù)這個錯誤其實也很容易,我們再加一個 @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,將會看到如下響應(yīng):

{"item_id":"11"}

如果我們運行示例并訪問 http://127.0.0.1:8001/items/xiaoming,將會看到如下響應(yīng):

{"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ù)值符合預(yù)期的格式和約束。這可以防止無效的參數(shù)值傳遞到請求處理函數(shù)中,提高了數(shù)據(jù)的有效性和安全性。
  • 自動生成文檔和 OpenAPI 規(guī)范:FastAPI 使用 Pydantic 模型作為路徑參數(shù)時,能夠自動根據(jù)模型的定義生成路徑參數(shù)的文檔和 OpenAPI 規(guī)范。這樣,你不僅可以確保文檔與實際代碼保持同步,還可以獲得更詳細和準確的文檔信息,包括參數(shù)類型、驗證規(guī)則和示例值等。
  • 代碼重用和可維護性:使用 Pydantic 模型作為路徑參數(shù)可以提高代碼的重用性和可維護性。你可以在多個路由中使用相同的模型作為路徑參數(shù),避免了重復(fù)定義和驗證參數(shù)的過程。這樣,如果需要更改參數(shù)的類型或驗證規(guī)則,你只需要修改模型的定義,而不必在多個地方修改代碼。
  • 更清晰的代碼結(jié)構(gòu):通過使用 Pydantic 模型作為路徑參數(shù),可以使代碼結(jié)構(gòu)更清晰和可讀。模型的定義提供了一種統(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的結(jié)果:

{'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,將會看到如下響應(yīng):

{"item_id":"11"}

訪問 http://127.0.0.1:8001/items/101 ,將會看到如下響應(yīng):

{
  "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ù)用于提供關(guān)于該參數(shù)的額外信息,例如描述、示例值、別名等。這些元數(shù)據(jù)可以通過在路徑參數(shù)聲明中使用參數(shù)關(guān)鍵字參數(shù)的方式進行設(shè)置。使用元數(shù)據(jù)可以提高代碼的可讀性和維護性。

FastAPI 使用元數(shù)據(jù)來生成自動化的文檔,包括 API 文檔和交互式 API 文檔(Swagger UI 或 ReDoc)。元數(shù)據(jù)提供了關(guān)于路徑參數(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)容,更多關(guān)于FastAPI路徑參數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python判斷字符串的前兩個字母是否是"id"的示例代碼

    python判斷字符串的前兩個字母是否是"id"的示例代碼

    這篇文章主要介紹了python判斷字符串的前兩個字母是否是”id",使用 Python 的字符串切片來判斷一個字符串的前兩個字母是否是 "id",本文結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • Python中的xlrd模塊使用整理

    Python中的xlrd模塊使用整理

    今天給大家?guī)淼奈恼率顷P(guān)于Python的相關(guān)知識,文章圍繞著xlrd模塊的使用展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python3處理文件中每個詞的方法

    Python3處理文件中每個詞的方法

    這篇文章主要介紹了Python3處理文件中每個詞的方法,可實現(xiàn)逐個處理文件中每個詞的功能,需要的朋友可以參考下
    2015-05-05
  • 對python使用telnet實現(xiàn)弱密碼登錄的方法詳解

    對python使用telnet實現(xiàn)弱密碼登錄的方法詳解

    今天小編就為大家分享一篇對python使用telnet實現(xiàn)弱密碼登錄的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 用Python寫飛機大戰(zhàn)游戲之pygame入門(4):獲取鼠標的位置及運動

    用Python寫飛機大戰(zhàn)游戲之pygame入門(4):獲取鼠標的位置及運動

    這篇文章主要介紹了用Python寫飛機大戰(zhàn)游戲之pygame入門(4):獲取鼠標的位置及運動,需要的朋友可以參考下
    2015-11-11
  • pyqt4教程之messagebox使用示例分享

    pyqt4教程之messagebox使用示例分享

    這篇文章主要介紹了pyqt4的messagebox使用示例,需要的朋友可以參考下
    2014-03-03
  • django+xadmin+djcelery實現(xiàn)后臺管理定時任務(wù)

    django+xadmin+djcelery實現(xiàn)后臺管理定時任務(wù)

    這篇文章主要介紹了django+xadmin+djcelery實現(xiàn)后臺管理定時任務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • python3.8.3安裝教程及環(huán)境配置的詳細教程(64-bit)

    python3.8.3安裝教程及環(huán)境配置的詳細教程(64-bit)

    這篇文章主要介紹了python3.8.3安裝教程及環(huán)境配置的詳細教程(64-bit),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 解決uWSGI的編碼問題詳解

    解決uWSGI的編碼問題詳解

    最近在用Flask 寫的應(yīng)用通過 Supervisor+uWSGI 部署到正式服務(wù)器上時出現(xiàn)了錯誤,通過查找相關(guān)的資料終于解決了,所以想著分享出來給大家,下面這篇文章主要介紹了解決uWSGI的編碼問題的相關(guān)資料,需要的朋友可以參考下。
    2017-03-03
  • Python requirements.txt使用小結(jié)

    Python requirements.txt使用小結(jié)

    requirements.txt是Python項目中用于記錄項目依賴包及其版本信息的文本文件,類似于Node.js的或Java的pom.xml,下面就來詳細的介紹一下requirements.txt使用,感興趣的可以了解一下
    2025-11-11

最新評論

元氏县| 宣汉县| 苏州市| 龙江县| 庐江县| 乡宁县| 易门县| 安多县| 禄丰县| 昭平县| 城口县| 新民市| 拉萨市| 吉隆县| 松滋市| 姚安县| 资溪县| 中宁县| 项城市| 酒泉市| 石台县| 谷城县| 莱西市| 遂昌县| 盱眙县| 兰西县| 山西省| 武清区| 偏关县| 商洛市| 西充县| 双鸭山市| 东阳市| 镇沅| 大邑县| 电白县| 阳城县| 晋宁县| 铜鼓县| 崇文区| 乌拉特中旗|