한양과학기술고등학교

에듀테크 프로젝트 대시보드

응답 모델과 상태 코드

response_model status_code 필드 필터링 Response

반환 데이터의 스키마를 선언해 출력에서 민감 필드를 제거하고 문서를 정확하게 만듭니다.

1. 입력 모델 / 출력 모델 분리

class UserIn(BaseModel):
    username: str
    password: str        # 입력엔 있고

class UserOut(BaseModel):
    username: str        # 출력엔 없음

@app.post("/users", response_model=UserOut)
def create(user: UserIn):
    save(user)
    return user          # password 가 있어도 응답에선 잘려나감

2. response_model_exclude_none 등

@app.get(
    "/items/{id}",
    response_model=Item,
    response_model_exclude_none=True,     # None 필드 제외
    response_model_exclude={"internal_note"},
)
def read(id: int): ...

3. 상태 코드

from fastapi import status

@app.post("/items", status_code=status.HTTP_201_CREATED)
def create(): ...

@app.delete("/items/{id}", status_code=204)
def delete(id: int):
    ...
    return None   # 204 는 본문 없음

4. Response 클래스 직접 반환

from fastapi.responses import JSONResponse, PlainTextResponse, RedirectResponse, StreamingResponse

@app.get("/csv")
def csv():
    return StreamingResponse(row_iter(), media_type="text/csv")

@app.get("/old")
def old():
    return RedirectResponse("/new", status_code=307)
주의
  • Response 를 직접 반환하면 response_model 검증·필터링을 건너뜀

5. 추가 응답 문서화

@app.get(
    "/items/{id}",
    response_model=Item,
    responses={404: {"description": "아이템 없음"}},
)
def read(id: int): ...
"명시적 의존성 주입은 테스트를 쉽게 만든다"