본문 바로가기

웹 프레임워크/FastAPI

FastAPI - 06 (경로 매개변수와 숫자 유효성 검사)

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

Path 사용

Path를 사용 하여 유효성 검사 및 메타데이터를 선언 할 수 있습니다.

from typing import Union

from fastapi import FastAPI, Path, Query    # Path import
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    # Path를 사용하여 item_id의 메타데이터(title)를 지정
    # Annotated를 사용
    item_id: Annotated[int, Path(title="The ID of the item to get")],
    q: Annotated[Union[str, None], Query(alias="item-query")] = None,
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

숫자 제약 조건

Query, Path를 사용 하여 숫자 제약 조건을 지정 할 수 있습니다.

from fastapi import FastAPI, Path
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    # ge=1 - item_id는 1 이상의 값이어야 함
    item_id: Annotated[int, Path(title="The ID of the item to get", ge=1)], q: str
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results
http://localhost:8000/items/1?q=foo

위의 URL로 접속하면 item_id의 값이 1로 1이상 이므로 아래의 결과가 나옵니다.

{"item_id":1,"q":"foo"}

 

http://localhost:8000/items/0?q=foo

위의 URL로 접속하면 item_id의 값이 0으로 1미만 이므로 아래와 같이 에러가 발생합니다.

{
    "detail": [
        {
            "loc": [
                "path",
                "item_id"
            ],
            "msg": "Input should be greater than or equal to 1",
            "input": "0",
            "ctx": {
                "ge": 1
            },
            "url": "https://errors.pydantic.dev/2.4/v/greater_than_equal"
        }
    ]
}

참고로 아래의 URL로 접속하면 q의 값이 문자열 타입의 필수 이므로 q의 값이 없어 에러가 발생합니다.

http://localhost:8000/items/1

조건

  • gt: greater than
  • le: less than or equal