Cookie和Header
前面的學習記錄提到過FastApi框架提供了Cookie和Header方法用於接受cookie和header參數。
cookie參數的接受和Query沒有什麼不同
@app.get("/request01")
def request01(*, val: str = Cookie(...)):
return val
@app.get("/request02")
def request02(*, val: str = Header(...)):
return val
@app.get("/request03")
def request03(*, val_item: str = Header(...)):
return val_item
@app.get("/request04")
def request04(*, val_list: List[str] = Header(...)):
return val_list
Header的用法也類似,注意,header的分隔符要求是減號"-",但是"-"在變量名稱是不合法的,所以調用時傳入val-item,在接收時會自動轉化成val_item, 同時也會忽略大小寫,比如調用時傳入Val-Item,在接收val_item就可以。如果傳入多個相同val-item時,後臺可以以數組的形式接收。
Response Model返回的數據
和request-body相對的,返回的數據模型。
class Item(BaseModel):
name: str
age: int = 18
@app.post("/request05", response_model=Item)
def request05(*, item: Item):
return item
@app.post("/request06", response_model=List[Item])
def request06(*, item: Item):
return [item, item]
class OutItem(BaseModel):
name: str
@app.post("/request07", response_model=OutItem)
def request07(*, item: Item):
return item
@app.post("/request08", response_model=Item, response_model_exclude_unset=True)
def request08(*, item: Item):
return item
@app.post("/request09", response_model=Item, response_model_include={"name"})
def request09(*, item: Item):
return item
@app.post("/request10", response_model=Item, response_model_exclude={"age"})
def request10(*, item: Item):
return item
通過response_model來指定返回的數據模型
request06:可以指定爲數據的類型
request07:可以指定的別的數據類型,最後返回的結果只包含兩個Model都包含的字段。
request08:response_mode_exclude_unset=True, 在response_model中並沒有被設置時,在返回時被忽略。
request09-10:response_model_include和response_model_exclude,注意是set類型,在返回的數據中是否包含該key
其他的Model處理
class Item1(BaseModel):
name: str
age: int = 1
class Item2(BaseModel):
name: str
age: int
alias_name: str = "別名"
class Item3(Item1):
alias_name: str = "別名"
class Item4(BaseModel):
alias_name: str = "別名"
@app.post("/request11")
def request11(*, item: Item1):
print(item.dict())
item2 = Item2(**item.dict())
return item2
@app.post("/request12")
def request12(*, item: Item1):
item3 = Item3(**item.dict(), alias_name="哈哈")
return item3
@app.post("/request13", response_model=Union[Item1, Item4])
def request13(*, item: Item1):
return item
@app.post("/request14", response_model=Dict[str, int])
def reqeust14():
return {"a": 1, "b": 2}
Pydantic的Basemodel可以適用dict形式的數據賦值,item是一個BaseModel實例,item.dict()得到的是一個dict類型的數據,**item.dict()就像解構一樣,給BaseModel賦值。
可以利用繼承的特性,避免重複的key。
可以使用Union(from typing import Union),聯合多個BaseModel作爲response_model。
response_model可以聲明成Dict[str, int]字典類型的(和request-body相同)
response_model可以聲明成List(Item1)數組類型(和request-body相同)
Form表單數據
@app.post("/request15")
def request15(name: str = Form(...)):
return name
適用Form方法,和Query,Path使用方法想用,但是得提前安裝一個庫pip install python-multipart
File和UploadFile上傳
@app.post("/request16")
def request16(file: bytes = File(...)):
return len(file)
@app.post("/request17")
async def request17(file: UploadFile = File(...)):
with open("./%s" % file.filename, "wb") as f:
content = await file.read()
f.write(content)
f.close()
return file.filename
@app.post("/reqeust18")
def request18(files: List[UploadFile] = File(...)):
res = []
for file in files:
res.append(file.filename)
return res
使用File和UploadFile來接受上傳的文件。也可以適用bytes和File來接收文件,但是UploadFile更有優勢。
UploadFile提供了屬性:filename和content-type和read, seek, close, write等方法用於操作文件流,但是注意的是這些方法都是異步的,所以調用時應使用await裝飾,同時接口函數也應該定義成async異步。
request17實現了一個簡單的文件上傳並保存,將文件流寫入到文件句柄中並保存。
request18適用List[UploadFile]聲明接受多個文件。