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에 복사합니다.