FastApi 학습 - 05

3728 단어 FastApi

이상 제어(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을 정의할 수도 있고, 사용자 정의 헤더를 추가할 수도 있습니다.
request02: 사용자 정의 Exception, 표준 status_ 반환코드 및 사용자 정의 콘텐츠
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_코드: 이상이 없거나 수동으로 이상을 던지면 지정한 status_code
태그: 이 인터페이스에 대한 그룹 표시
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의 키입니다.
exclude:dict로 변환될 때 필요 없는field
BaseModel의 copy() 메서드
deep: 딥 카피 여부.
업데이트:dict 데이터로 item을 업데이트합니다.그리고 item2에 복사합니다.

좋은 웹페이지 즐겨찾기