FastApi學習-05

異常控制(http status code)

@app.get("/request01")
def request01():
    raise HTTPException(status_code=401, detail={"custom": "自定義數據類型"}, headers={"Err-Msg": "123"})
    return "hello world"

class MyException(Exception):
    def __init__(self, msg):
        self.msg = msg

@app.exception_handler(MyException)
async def my_exception_handler(request: Request, e: MyException):
    return JSONResponse(
        status_code=418,
        content={"message": f"{e.msg}", "data": 123},
    )

@app.get("/request02")
def request02():
    raise MyException(msg="123")
    return "hello world"

@app.exception_handler(RequestValidationError)
async def my_request_validation_exception(request: Request, e: RequestValidationError):
    # 解析RequestValidationError的數據,重新拼接返回
    rtype = e.raw_errors[0].loc_tuple()[0]
    rkey = e.raw_errors[0].loc_tuple()[1]
    msg = e.raw_errors[0].exc.msg_template
    return JSONResponse(
        status_code=418,
        content=[rtype, rkey, msg]
    )

@app.exception_handler(SelfException)
async def my_exception_handler1(request: Request, e: HTTPException):
    print("hello exception")
    return await http_exception_handler(request, e)

@app.get("/request03")
def request03(num: int = Query(...)):
    return "hello world"

request01:使用raise拋出自定義的HTTPException,可以自定義status_code(這個status_code是在標準內的),可以定義返回的內容detail,也可以增加自定義的headers.

request02:自定義Exception,返回標準的status_code和自定義的content

my_request_validation_exception方法:覆蓋其他的Exception,實現自定義功能

my_request_handler1方法:複用其他的Exception Handler,實現自定義功能

API文檔配置

在@app.get()裝飾器中加入響應的配置參數,優化API文檔的顯示。

@app.get("/request04", status_code=status.HTTP_401_UNAUTHORIZED, tags=["request"], summary="1", description="1",
         response_description="1", deprecated=True)
def request04():
    return "hello world"

status_code: 如果沒有異常或者手動的拋出異常,都會返回指定的status_code

tags: 爲該接口分組標示

summary, description, response_description:都是一些描述性文字,便於接口功能的理解

deprecated: 申明是否廢棄,但是不影響接口的調用,只是在文檔中標註廢棄。

jsonable_encoder BaseModel轉dict或者list

class Item(BaseModel):
    a: datetime
    b: date
    c: int
    d: str
    e: bool

@app.post("/request05")
def request05(item: Item):
    item1 = jsonable_encoder(item)
    print(type(item1))
    return item

@app.post("/request06")
def request06(item: List[Item]):
    item1 = jsonable_encoder(item)
    print(type(item1))
    return item

通過jsonable_encoder轉成對應的dict或者list,但是datetime,date,time會轉化成標準化的時間字符串

BaseModel的數據變換

在實際的業務中,會遇到各種情況對數據進行變換。

@app.post("/request07")
def request07(item: Item):
    print(item.dict(by_alias=True))
    print(item.dict(exclude_unset=True))
    print(item.dict(exclude_none=True))
    print(item.dict(exclude_defaults=True))
    print(item.dict(exclude={"c", "d"}))
    # copy方法
    item1 = {"d": 1993}
    print(item1)
    item2 = item.copy(update=item1, deep=True)
    return item2

BaseModel的dict()方法

by_alias: 轉化成dict的時候,key使用BaseModel中設置的alias_name

exclude_unset: 轉化成dict的時候,對於request-body中未設置的數據忽略,exclude_defaults和exclude_unset差不多。

exclude_none: 轉化成dict的時候,忽略值是None的key

exclude: 傳入轉化成dict的時候,不需要的field

BaseModel的copy()方法

deep: 是否是深拷貝。

update:以dict數據更新item。然後複製給item2

 

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