FastApi學習-04

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]聲明接受多個文件。

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