FastApi學習-02

URL路徑參數

@app.get("/param_get1/{param}")  # 以大括號包裹,默認是字符串類型,在路徑中獲取參數
def param_get1(param):
    return {"param": param}


@app.get("/param_get2/{param}")  # 可以指定數據類型,會進行數據類型轉化
def param_get2(param: int):
    return {"param": param}

在param_get2方法中,聲明瞭數據類型爲int型,當訪問的路徑爲”/param_get2/123“時,方法param變量的值爲int型的123。當傳入的是一個不可轉化的數據類型時,例如"/param_get2/abc"時,接口會返回一個code爲422(無法處理的實體)。

@app.route("/param_get3/me")
def param_get3():
    return {"param": "me"}


@app.route("/param_get3/{param}")
def param_get4(param):
    return {"param": param}

param_get4定義的路徑其實是包含param_get3定義的路徑的,這種情況,不存在變量的路徑一定要在存在變量的路徑之前定義

class items(str, Enum):
    a = "a"
    b = "b"
    c = "c"


@app.get("/param_get5/{param}")
def param_get5(param: items):
    return {"param": param}

當我們希望參數在一定範圍內的時候,可以適用上述的形式,定義一個枚舉類,聲明參數在這個範圍內,如果參數超過這個範圍,拋出422異常

@app.get("/param_get6/{file_path: path}")
def param_get6(file_path):
    return {"file_path": file_path}

當我們需要參數是一個路徑的形式的時候,需要在路徑中聲明,而不是在接口函數中聲明,聲明的方式如上

Query參數

@app.get("/param_query1")
def param_query1(a, b):  # 默認是str類型
    return [a, b]


@app.get("/param_query2")
def param_query2(a: int, b: float):  # 聲明數據類型
    return [a, b]


@app.get("/param_query3")
def param_query3(a: int = 1, b: float = 2.3):  # 給參數聲明瞭默認值
    return [a, b]

默認的是str的數據類型,也可以自己指定數據類型,也可以給參數賦予默認值。當參數聲明默認值之後,該參數成爲非必傳參數,如果未設置默認值(默認值可以爲None),該參數必傳,否則返回422,提示參數丟失。

Request Body參數

from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int = 18

@app.post("/param_request_body1")
def param_request_body1(user: User):
    return user

request_body的方式不支持Http-Get方法。

引入了pydantic的BaseModel來接受request_body,如果在方法中聲明的int類型,則接收的是query參數。

在User的聲明中,name未設置默認值,age設置了默認值,則name爲request_body中的必要參數,age爲非必要,如果不傳,則獲取其默認值。

可以混合query參數和path參數

Path和Query的數據校驗

FastApi對於接受的參數提供了一定的數據檢驗功能,可通過Path和Query來進行數據的檢驗。FastApi還提供了Header,Cookie,Body,Form,File,Security,Depends等參數的簡要功能,這裏只簡單介紹下Path和Query的功能

# 數據校驗
from fastapi import Query, Path

@app.get("/param_validate1/{item}")
def param_validate1(item: int = Path(1, description = "描述", ge = 10)):
    return {"item": item}

@app.get("/param_validate2")
def param_validate2(item: int = Query(1, description = "query參數", le = 10)):
    return {"item": item}

@app.get("/param_validate3")
def param_validate3(item: int = Query(..., description = "query參數", le = 10)):
    return {"item": item}

Path和Query的方法相近,所以介紹一個就行。上文提到過必要參數和非必要參數的區別,在這裏適用Query的檢驗,第一個參數設置成默認值,就是有默認值的非必要參數,如果設置成”...“就是必要參數。

描述類的參數:

title和description用於描述參數的名稱與介紹

alias_name相當於一個和參數名(item)的映射,主要用於參數名不合法的情況,例如使用參數名(item-name)。

deprecated用於表示該接口是否棄用。

對於int類型的參數,可以適用lt(小於),le(小於等於),gt(大於),ge(大於等於)四個方法來校驗數據的數值範圍。

@app.get("/param_validate4")
def param_validate4(item: str = Query(..., description="字符串長度限制", min_length = 3)):
    return {"item": item}

@app.get("/param_validate5")
def param_validate5(item: str = Query(..., description="正則表達式", regex=r"[0-7]+")):

對於str類型的參數,可以適用min_length,max_length來限制字符串的長度,也可以使用正則表達式規範字符串。

@app.get("/param_validate6")
def param_validate6(item: List[str] = Query(None)):
    return {"item": item}

@app.get("/param_validate7")
def param_validate7(item: List[str] = Query(["a", "b"])):
    return {"item": item}

Query參數也可以獲取數組類的參數,可以設置默認值,也可以設置必要參數。接口調用的方式類似與/param_validate7?item=1&item=2&item=3,後臺獲取的參數爲數組["1", "2", "3"]


@app.get("/param_validate8")
def param_validate8(t1: str = None, t2: str):
    return [t1, t2]

@app.get("/param_validate9")
def param_validate9(*, t1: str = None, t2: str):
    return [t1, t2]

@app.get("/param_validate10")
def param_validate10(t1: str = None, t2: str = Query(...)):
    return [t1, t2]

當有多個參數的時候要考慮參數的順序,上述代碼中param_validate8的方法會報錯,因爲參數中有默認值的參數定義在沒有默認值參數的前面,這在python中是不允許的。

方案一:變更順序爲合法的,沒有默認值在前,有默認值在後。

方案二:在參數聲明時第一位加上"*"

方案三:使用Query,Path等聲明。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章