본문 바로가기

웹 프레임워크/FastAPI

FastAPI - 09 (응답 상태 코드 - Response Status Code)

출처: https://fastapi.tiangolo.com/tutorial/response-status-code/
아래의 내용은 공식 사이트의 내용을 제 경험과 생각을 추가하여 다시 정리한 것 입니다.

응답 상태 코드

status_code 매개변수를 사용하여 응답에 대한 HTTP 상태 코드를 선언할 수 있습니다.

from fastapi import FastAPI

app = FastAPI()


# status_code 매개변수를 사용하여 응답에 대한 HTTP 상태 코드를 선언
@app.post("/items/", status_code=201)
async def create_item(name: str):
    return {"name": name}

 

테스트 - python 코드

import requests

def test_create_item():
    url = "http://localhost:8000/items/"
    data = {"name": "Hong"}

    response = requests.post(url, json=data)

    print("Status Code:", response.status_code)
    print("Response Body:", response.json())

if __name__ == "__main__":
    test_create_item()

 

결과

Status Code: 422
Response Body: {'detail': [{'type': 'missing', 'loc': ['query', 'name'], 'msg': 'Field required', 'input': None, 'url': 'https://errors.pydantic.dev/2.4/v/missing'}]}

 

공식 사이트에 나오는 위의 소스는 정상적으로 작동 하지 않습니다. 정상적으로 작동하게 하려면 아래와 같이 작성해야 합니다.

get 방식으로 변경

from fastapi import FastAPI

app = FastAPI()


# status_code 매개변수를 사용하여 응답에 대한 HTTP 상태 코드를 선언
# get 방식으로 변경
@app.get("/items/", status_code=201)
async def create_item(name: str):
    return {"name": name}

 

테스트

http://localhost:8000/items/?name=Hong

 

결과

{"name":"Hong"}

post 방식에서 Pydantic's BaseModel을 추가

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str

@app.post("/items/", status_code=201)
async def create_item(item: Item):
    return {"name": item.name}

 

테스트

import requests

def test_create_item():
    url = "http://localhost:8000/items/"
    data = {"name": "Hong"}

    response = requests.post(url, json=data)

    print("Status Code:", response.status_code)
    print("Response Body:", response.json())

if __name__ == "__main__":
    test_create_item()

 

결과

Status Code: 201
Response Body: {'name': 'Hong'}

 

Status Code: 201이 출력 되는 것을 확인 할 수 있습니다.

응답 상태 코드를 사용 할 수 있는 경로 연산자

  • @app.get()
  • @app.post()
  • @app.put()
  • @app.delete()
  • 등.

HTTP 상태 코드

공식 사이트의 내용을 그대로 옮겨 왔습니다.

  • 1xx 상태 코드는 "정보"용입니다. 이들은 직접적으로는 잘 사용되지는 않습니다. 이 상태 코드를 갖는 응답들은 본문을 가질 수 없습니다.
  • 2xx 상태 코드는 "성공적인" 응답을 위해 사용됩니다. 가장 많이 사용되는 유형입니다.
    • 200 은 디폴트 상태 코드로, 모든 것이 "성공적임"을 의미합니다.
    • 다른 예로는 201 "생성됨"이 있습니다. 일반적으로 데이터베이스에 새로운 레코드를 생성한 후 사용합니다.
    • 단, 204 "내용 없음"은 특별한 경우입니다. 이것은 클라이언트에게 반환할 내용이 없는 경우 사용합니다. 따라서 응답은 본문을 가질 수 없습니다.
  • 3xx 상태 코드는 "리다이렉션"용입니다. 본문을 가질 수 없는 304 "수정되지 않음"을 제외하고, 이 상태 코드를 갖는 응답에는 본문이 있을 수도, 없을 수도 있습니다.
  • 4xx 상태 코드는 "클라이언트 오류" 응답을 위해 사용됩니다. 이것은 아마 가장 많이 사용하게 될 두번째 유형입니다.
    • 일례로 404 는 "찾을 수 없음" 응답을 위해 사용합니다.
    • 일반적인 클라이언트 오류의 경우 400 을 사용할 수 있습니다.
  • 5xx 상태 코드는 서버 오류에 사용됩니다. 이것들을 직접 사용할 일은 거의 없습니다. 응용 프로그램 코드나 서버의 일부에서 문제가 발생하면 자동으로 이들 상태 코드 중 하나를 반환합니다.

응답 상태 코드의 상수

상수 사용 예시

from fastapi import FastAPI, status # status 추가

app = FastAPI()

# status.HTTP_201_CREATED 상수 사용
# status. -> 편집기의 지원으로 상수 목록을 볼 수 있음
@app.post("/items/", status_code=status.HTTP_201_CREATED)
async def create_item(name: str):
    return {"name": name}

 

편집기의 자동 완성 기능 사용 예시

자동 완성 예시