FastAPI請求系列(一) 路徑參數與數值校驗


一、基本使用

1、基本路徑參數

如下:

from fastapi import FastAPI

app = FastAPI()


@app.get("/item/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

上面黃色部分包含路徑、操作,其中:

  • /item/{item_id}   被稱為路徑
  • get 被稱為操作,表示一種HTTP的方法(比如,POST/PUT/DELETE等)

{item_id}作為路徑中的參數,其值將作為參數item_id傳遞給函數。

  在函數中標明了路徑參數應該接受什么類型的參數,這種類型的聲明會進行數據校驗,比如輸入不符合的參數值:

{
  "detail": [
    {
      "loc": [
        "path",
        "item_id"
      ],
      "msg": "value is not a valid integer",
      "type": "type_error.integer"
    }
  ]
}

會出現錯誤的提示信息,包括出錯的位置信息等。

2、路徑順序

如果有多個路徑時,注意它們的順序,因為請求是按照順序來進行匹配的,比如:

from fastapi import FastAPI

app = FastAPI()

@app.get("/path/parameters")
def path_params_1():
    return {"message":"This is path_params_1"}

@app.get("/path/{parameters}")
def path_params_2(parameters:str):
    return {"message":parameters}

上面的兩個接口,如果調用第二個接口,並且傳入的值為parameters,那么就會匹配到第一個接口,所以在開發中注意調整接口的順序。

3、枚舉值

顯然上述的參數都是自己來進行輸入的,至於輸入什么接口是無從得知的,那么枚舉值就是用來進行值的預設。

from fastapi import FastAPI
from enum import Enum

app = FastAPI()

class CityName(str,Enum):
    Xian = "Xian china"
    Shanghai = "Shanghai china"

@app.get("/enum/{city}")
async def city_info(city:CityName):
    if city == CityName.Xian:
        return {"info":city}
    if  city == CityName.Shanghai:
        return {"info":city}

上述中實現預設值:

  • 定義你需要給接口的預設值的類
  • 使用定義的枚舉類創建類型標注的路徑參數

這樣交互式文檔中就有預設值:

4、包含路徑的路徑參數 

當路徑參數傳遞的是一個路徑時,FastAPI又如何解析呢?比如上傳文件的路徑。

from fastapi import FastAPI

# 包含路徑
@app.get("/file/{file_path:path}")
async def read_file(file_path:str):
    return {"file_path":file_path}

可以通過路徑轉換器,在file_path這個路徑參數后面通過:path來指明匹配的是任意路徑。

二、進階

上面對路徑參數的校驗是通過簡單的類型校驗,如果想進行更為復雜的校驗需要用到Path 模塊。

from fastapi import FastAPI
from fastapi import Path

app = FastAPI()

@app.get("/path/{num}")
def path_params_validate(
        num:int = Path(...,title="input your num",description="description num",ge=1,le=5 ) 
):
    return num

路徑參數是路徑的一部分,所以它是必需的,通過"..."將其標記為必需參數,即使默認值給的是None依然是必需參數。可以通過查看Path方法查看傳遞的更多參數:

class Path(Param):
    in_ = ParamTypes.path

    def __init__(
        self,
        default: Any,
        *,
        alias: Optional[str] = None,
        title: Optional[str] = None,
        description: Optional[str] = None,
        gt: Optional[float] = None,
        ge: Optional[float] = None,
        lt: Optional[float] = None,
        le: Optional[float] = None,
        min_length: Optional[int] = None,
        max_length: Optional[int] = None,
        regex: Optional[str] = None,
        example: Any = Undefined,
        examples: Optional[Dict[str, Any]] = None,
        deprecated: Optional[bool] = None,
        **extra: Any,
    ):
...
...

可以看到里面的驗證參數很全,除了常用的一些,另外還可以通過正則進行驗證。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM