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等聲明。