FastAPI, 422 ValidationError 리턴 값 구조 변경 예제
글. 수알치 오상문
FastAPI는 422 ValidationError 기본 핸들러를 제공하고 있는데,
사용자가 원하는 형태로 바꾸고 싶으면 다음 예제처럼 처리합니다.
from fastapi import FastAPI, HTTPException, Request, status
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse, JSONResponse
from fastapi.encoders import jsonable_encoder
from starlette.exceptions import HTTPException as StarletteHTTPException
from pydantic import BaseModel
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 JSONResponse(
status_code=422,
content=jsonable_encoder({"status_cd":"200",
"status_msg":"Request Validation Error",
"detail": exc.errors()[0]["msg"]}),
)
# (1) 422 에러를 직접 처리하는 경우... HTTPException을 활용한다.
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 3:
raise HTTPException(status_code=422, detail="Nope! I don't like 3.")
return {"item_id": item_id}
class Item(BaseModel):
name: str
# (2) 앞 붉은 색 코드에서 기본 핸들러를 대체하여 처리한다.
# POST 전달 값이 없거나 형식에 문제가 있으면 사용자 핸들러가 동작한다.
@app.post("/post")
async def post_item(data: Item):
return data
POST 호출을 할 때 아무 값도 넣지 않으면, 예제에서 지정한 에러 형식으로 응답된다.
{
"status_cd": "200",
"status_msg": "Request Validation Error",
"detail": "field required"
}
[참고] 이렇게 수정해도 ....
Swagger 페이지(...\docs)에 나오는 422 에러 안내에는 반영되지 않는다.
(422 에러 메시지 처리는 변경되지만, 아래쪽에 나오는 에러 안내 부분이 바뀌지 않음)
그 부분은 에러 처리와 별도로 변경해야 하는 부분이므로 다음에 다루겠다.
{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}
[주의] 버저닝(fastapi_versioning) 기능 사용 시 사용자 에러 핸들러가 동작하지 않는 문제
다음처럼 fastAPI 버저닝 기능을 사용하는 경우,
from fastapi_versioning import VersionedFastAPI, version
앞에서 만든 사용자 핸들러가 동작하지 않는 문제가 있다.
이 경우에 아래 링크를 참고한다.
(필자는 아래 내용 참고하려다가 fastapi_versioning 기능을 포기하고 링크 변경으로 처리... )
https://medium.com/geoblinktech/fastapi-with-api-versioning-for-data-applications-2b178b0f843f
'FastAPI' 카테고리의 다른 글
FastAPI, docs/redoc js, css, 로고, 파비콘을 static 처리 (0) | 2022.02.21 |
---|---|
FastAPI, 로그인 구현 (0) | 2022.02.14 |
FastAPI, 워커(worker) 개수 자동 계산하기 (0) | 2022.02.04 |
FastAPI - A python framework | Full Course (0) | 2022.01.28 |
FastAPI 백그라운드 작업 (이메일 전송, 파일 저장 등 백그라운드 태스크) (0) | 2022.01.27 |