728x90
HTTP 에러를 사용자에 맞게 커스텀이 가능하다.(음수가 조건에 들어왔을 때 에러가 나오게 하는 게 목표)
1. import JSONResponse, Request
from fastapi import FastAPI, HTTPException, Request
from starlette.responses import JSONResponse
2. Exception을 상속하는 클래스 생성
class NegativeNumberException(Exception):
def __init__(self, books_to_return: int):
self.books_to_return = books_to_return
3. @app.exception_handler() 데코레이션을 사용하여 handler를 등록
@app.exception_handler(NegativeNumberException)
async def negative_number_exception_handler(request: Request, exception: NegativeNumberException):
return JSONResponse(
status_code=418,
content={"message":f"Hey, why do you want {exception.books_to_return}"
f"books? you need to read more!"}
- 예외를 요청하는 Request
- exception이라는 매개변수를 NegativeNumberException 클래스라고 정의(클래스의 값들을 쓸 수 있음)
- JSON응답을 반환(code 418 에러와 같이 출력할 메시지 content를 정의)
code 418: 서버는 해당 응답을 회신 할 수 없다는 오류코드
즉, 조건에 맞지 않는 요청을 했기 때문에 나는 오류
4. GET 요청 함수에 조건값 추가
@app.get("/")
async def read_all_books(books_to_return: Optional[int] = None):
if books_to_return and books_to_return < 0:
raise NegativeNumberException(books_to_return=books_to_return)
if len(BOOKS) < 1:
create_books_no_api()
if books_to_return and len(BOOKS) >= books_to_return > 0:
i = 1
new_books = []
while i <= books_to_return:
new_books.append(BOOKS[i - 1])
i += 1
return new_books
return BOOKS
- books_to_return이 존재하고 0보다 작을 때 handler에 등록한 NegativeNumberException 클래스에 요청 들어온 값을 담는다.
- handler가 반응을 하고 418 code와 content를 return 한다.
5. Swagger 확인
- 1을 넣었을 땐 200 code로 값을 잘 가져온 것을 볼 수 있고 -1을 넣었을 때 사전 오류로 정의한 것이 잘 노출되고 있다.
728x90
SMALL
'Develop > FastAPI' 카테고리의 다른 글
FastAPI Status Code Response - 26 (0) | 2022.12.24 |
---|---|
FastAPI Response Model - 25 (0) | 2022.12.24 |
FastAPI Raise HTTP Exception - 23 (0) | 2022.12.24 |
FastAPI Delete Request - 22 (0) | 2022.12.23 |
FastAPI Put Request - 21 (2) | 2022.12.23 |