FastAPI請求系列(二) 查詢參數與字符串校驗


一、基本使用

 查詢參數是什么呢?一般前台發送的請求可能是這樣的 http://127.0.0.1:8000/items/?skip=0&limit=10 那么"?"之后的就是查詢參數每個查詢參數直接通過“&”進行連接。查詢參數:

  • skip:值為0
  • limit:值為10

那么在FastAPI的后台就需要進行接收。

1、可選、非可選查詢參數

from fastapi import FastAPI

app = FastAPI()


@app.get("/query")
async def page_limit(skip: int = 1, limit: int = 10):
    return {"skip": skip, "limit": limit}

在上述實例中聲明了兩個查詢參數的類型是int,並且都有自己的默認值,查詢參數與路徑參數不同,它不是路徑的一部分,所以是可選的。你可以通過下面的請求方式均可:

# 請求一
http://127.0.0.1:8000/query

# 請求二
http://127.0.0.1:8000/query?skip=1   # limit值為空

# 請求三
http://127.0.0.1:8000/query?limit=10 # skip值為空

# 請求四
http://127.0.0.1:8000/query?skip=1&limit=10

其最終的返回結果均是:

{
  "skip": 1,
  "limit": 10
}

當然還可以通過類型聲明來進行控制:

from fastapi import FastAPI
from typing import Optional

app = FastAPI()


@app.get("/query")
async def page_limit(skip: Optional[int] = 1, limit: Optional[int] = 10):
    return {"skip": skip, "limit": limit}

通過Optional來聲明skiip查詢參數是可選的int類型,並且默認值是1.。limit同理如此。但是這樣用就和之前沒有Optional的沒啥區別了,所以一般可以這樣使用:

from fastapi import FastAPI
from typing import Optional

app = FastAPI()


@app.get("/query")
async def page_limit(skip: int = 1, limit: Optional[int] = None):
    if limit:
        return {"skip": skip, "limit": limit}
    return {"skip": skip}

通過判斷前台是否傳遞這個參數的值,來進行返回。

在上述可選查詢參數中注意:

  • 如果沒有默認值就是必選(必填)參數
  • 如果有默認值就是可選(非必填)參數
  • 如果只是想成為可選參數而不想給一個特定的默認值,就使用Optional並且默認值為None

2、bool類型轉換 

如果聲明的查詢參數是bool類型,它們將會被自動轉換:

from fastapi import FastAPI

app = FastAPI()


@app.get("/query/bool/conversion")
async def type_conversion(param: bool = False):
    return param

當訪問以下路由:

# 路由一
http://127.0.0.1:8000/query/bool/conversion?param=yes

# 路由二
http://127.0.0.1:8000/query/bool/conversion?param=on

# 路由三
http://127.0.0.1:8000/query/bool/conversion?param=true

# 路由四
http://127.0.0.1:8000/query/bool/conversion?param=True

# 路由五
http://127.0.0.1:8000/query/bool/conversion?param=1

返回值均為true。

3、路徑參數與查詢參數

上述只是單純的查詢參數,那么實際上路由中既可以有路徑參數,同時也可以有查詢參數。FastAPI可以識別它們,並且不需要特定的順序。

from fastapi import FastAPI
from typing import Optional

app = FastAPI()


@app.get("/multi/params/{item_id}")
async def multi_params(item_id: int, skip: int = 1, limit: Optional[int] = None):
    item = {"item_id":item_id,"skip":skip}
    if limit:
        item.update({"limit":limit})
    return item

上述中:

  • item_id 是路徑參數,是必填參數
  • skip 是查詢參數,是選填參數,默認是1
  • limit 是查詢參數,是選填參數,默認值是None

二、進階

同路徑參數中的Path類似,查詢參數也提供了一個Query模塊提供功能更加完善的參數校驗。

from fastapi import FastAPI
from fastapi import Query
from typing import List

app = FastAPI()

@app.get("/query/validations")
def query_params_validate(
        value: str = Query(...,min_length=3,max_length=6,regex="^z"),
        values: List[str] = Query(["V1","V2"])
):

    return value,values

上述中:

  • value 必選參數(存在"...")
  • values 非必選參數(存在默認值)

調用接口:

 通過查看源碼,更多校驗參數:

class Query(Param):
    in_ = ParamTypes.query

    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