欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2024年03月26日 09:27:02   作者:shengjk1  
FastAPI中最核心的之一就是路徑參數(shù),所以這篇文章小編主要來和大家介紹一下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管理詳解

    Python使用Paramiko庫實現(xiàn)SSH管理詳解

    paramiko 是一個用于在Python中實現(xiàn)SSHv2協(xié)議的庫,它支持對遠程服務器進行加密的通信,本文主要介紹了如何使用Paramiko庫實現(xiàn)SSH管理,感興趣的小伙伴可以學習一下
    2023-11-11
  • Python 經(jīng)典面試題 21 道【不可錯過】

    Python 經(jīng)典面試題 21 道【不可錯過】

    這篇文章主要介紹了Python 經(jīng)典面試題 21 道,在python面試過程中這21道是經(jīng)常被問到了,感興趣的朋友跟隨小編一起看看吧
    2018-09-09
  • python爬取網(wǎng)站數(shù)據(jù)保存使用的方法

    python爬取網(wǎng)站數(shù)據(jù)保存使用的方法

    這篇文章主要介紹了使用Python從網(wǎng)上爬取特定屬性數(shù)據(jù)保存的方法,其中解決了編碼問題和如何使用正則匹配數(shù)據(jù)的方法,詳情看下文
    2013-11-11
  • Python input()函數(shù)用法大全

    Python input()函數(shù)用法大全

    input()函數(shù)獲取用戶輸入數(shù)據(jù),實現(xiàn)用戶交互,本文重點給大家介紹Python input()函數(shù)用法大全,感興趣的朋友一起看看吧
    2021-04-04
  • Python解決IndexError: list index out of range問題的三種方法

    Python解決IndexError: list index out of&nb

    IndexError是一種常見的異常類型,它通常發(fā)生在嘗試訪問列表(list)中不存在的索引時,錯誤信息“IndexError: list index out of range”意味著你試圖訪問的列表索引超出了列表的實際范圍,所以本文給大家介紹了Python成功解決IndexError: list index out of range
    2024-05-05
  • Python面向?qū)ο箢惱^承和組合實例分析

    Python面向?qū)ο箢惱^承和組合實例分析

    這篇文章主要介紹了Python面向?qū)ο箢惱^承和組合,結合實例形式分析了Python3面向?qū)ο罄^承的原理、用法以及繼承與組合相關使用技巧,需要的朋友可以參考下
    2018-05-05
  • Python Sqlite3以字典形式返回查詢結果的實現(xiàn)方法

    Python Sqlite3以字典形式返回查詢結果的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狿ython Sqlite3以字典形式返回查詢結果的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • Python爬取網(wǎng)易云歌曲評論實現(xiàn)詞云圖

    Python爬取網(wǎng)易云歌曲評論實現(xiàn)詞云圖

    這篇文章主要為大家介紹了Python爬取網(wǎng)易云歌曲評論實現(xiàn)詞云分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • python學習將數(shù)據(jù)寫入文件并保存方法

    python學習將數(shù)據(jù)寫入文件并保存方法

    在本篇文章里小編給大家分享的是關于python將數(shù)據(jù)寫入文件并保存的實例內(nèi)容,需要的朋友們可以學習下。
    2020-06-06
  • Python實現(xiàn)子類調(diào)用父類的方法

    Python實現(xiàn)子類調(diào)用父類的方法

    這篇文章主要介紹了Python實現(xiàn)子類調(diào)用父類的方法,解決子類覆蓋父類初始化方法而出現(xiàn)的不確定問題,可通過調(diào)用超類構造方法的未綁定版本或者使用super函數(shù)來解決,需要的朋友可以參考下
    2014-11-11

最新評論