728x90
Use HTTPException
FAstAPI 에서 오류는 HTTPException 클래스를 사용해 예외를 발생시켜 처리한다. HPPTException 클래스는 아래 세 개의 인수를 받는다
- status_code : 예외 처리시 반환할 상태코드
- detail : 클라이언트에게 전달한 메시지
- headers : 헤더를 요구하거나 응답을 위한 선택적 인수
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": "The Foo Wrestlers"}
@app.get("/items-header/{item_id}")
async def read_item_header(item_id: str):
if item_id not in items:
raise HTTPException(
status_code=404,
detail="Item not found",
headers={"X-Error": "There goes my error"},
)
return {"item": items[item_id]}
Override request validation exceptions
클라이언트에서 보낸 요청이 FastAPI 앱에서 정의한 데이터 유효성 검사를 통과하지 못했을 때 발생하는 예외로, Pydantic 모델에 의해 수행된 유효성 검사에서 문제가 발견될 경우 자동으로 발생시킨다. @app.exception_handler(RequestValidationError) 데코레이터를 사용하여 RequestValidationError 예외에 대한 사용자 지정 처리 방법을 정의할 수 있다.
from fastapi import FastAPI, HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPException
app = FastAPI()
@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request, exc):
return PlainTextResponse(str(exc.detail), status_code=exc.status_code)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
return PlainTextResponse(str(exc), status_code=400)
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 3:
raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
return {"item_id": item_id}
FastAPI는 자동으로 데이터 유효성 검사를 수행하지만, 때로는 유효성 검사 실패에 대한 응답을 커스터마이징하거나 추가적인 정보를 제공해야 할 때 사용한다.
FastAPI's HTTPException vs Starlette's HTTPException
FastAPI의 HTTPException 클래스는 Starlette의 HTTPException 클래스를 상속하지만 FastAPI의 HTTPException은 헤더를 추가할 수 있다. 코드 내에서 일반적으로 FastAPI의 HTTPException을 발생 시키는데 사용한다
FastAPI를 사용하면서 예외 핸들러를 등록할 때는 Starlette의 HTTPException에 대해서도 등록하는 것이 좋다. 이렇게 하면 Starlette의 내부 코드나 확장 기능에서 발생하는 HTTPException도 잡을 수 있다.
from fastapi import FastAPI, HTTPException
from fastapi.exception_handlers import (
http_exception_handler,
request_validation_exception_handler,
)
from fastapi.exceptions import RequestValidationError
from starlette.exceptions import HTTPException as StarletteHTTPException
app = FastAPI()
@app.exception_handler(StarletteHTTPException)
async def custom_http_exception_handler(request, exc):
print(f"OMG! An HTTP error!: {repr(exc)}")
return await http_exception_handler(request, exc)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
print(f"OMG! The client sent invalid data!: {exc}")
return await request_validation_exception_handler(request, exc)
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 3:
raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
return {"item_id": item_id}
728x90
'공부하는삶 > Python' 카테고리의 다른 글
Python numpy, tensorflow, pytorch array (0) | 2023.08.29 |
---|---|
Python (Avoiding) Flow Control (0) | 2023.08.29 |
Python Composite pattern(composition), Descriptor, Meta class (0) | 2023.08.29 |
Sequence (0) | 2020.05.09 |
Magic Method (0) | 2020.05.09 |
Gaussian Filter vs Bilateral Filter (0) | 2020.04.02 |