Skip to content

7. Path Parameters and Numeric Validations


1. Path Parameters and Numeric Validations

  • Query를 사용하여 query 매개변수에 대해 더 많은 유효성 검사 및 메타데이터를 선언할 수 있는 것과 같은 방식으로, Path를 사용하여 path 매개변수에 대해 동일한 타입의 유효성 검사 및 메타데이터를 선언할 수 있다.


2. Import Path

  • 먼저, fastapiPath를 임포트한다.


from typing import Optional
from fastapi import FastAPI, Path, Query

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
    item_id: int = Path(..., title="The ID of the item to get"),
    q: Optional[str] = Query(None, alias="item-query"),
):
    results = {"item_id": item_id}

    if q:
        results.update({"q": q})

    return results


3. Declare metadata

  • Query와 동일한 모든 매개변수를 선언할 수 있다.


  • 예를 들어, 다음과 같이 path 매개변수 item_id에 대한 title 메타데이터 값을 선언할 수 있다.


from typing import Optional
from fastapi import FastAPI, Path, Query

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
    item_id: int = Path(..., title="The ID of the item to get"),
    q: Optional[str] = Query(None, alias="item-query"),
):
    results = {"item_id": item_id}

    if q:
        results.update({"q": q})

    return results


Note

  • path 매개변수는 path의 일부여야 하므로 항상 필요하다.
  • 따라서 필수로 표시하기 위해 ...으로 선언해야 한다.
  • 하지만 None으로 선언하거나 기본값을 설정하더라도 아무런 영향을 미치지 않으나, 여전히 항상 필요하다.


4. Order the parameters as you need

  • query 매개변수 q를 필수 str으로 선언하려 한다고 가정해보자.
  • 이런 경우 해당 매개변수에 대해 다른 것을 선언할 필요가 없으므로 Query를 사용할 필요가 없다.
  • 하지만 path 매개변수 item_id에는 여전히 Path를 사용해야 하는데, 그 이유는 Python에서는 "기본값"이 없는 값 앞에 "기본값"이 있는 값을 넣으면 에러가 나기 때문이다.
  • 하지만 FastAPI를 사용하면 자동으로 재정렬되어 "기본값"이 없는 값(query 매개변수 q)을 먼저 가질 수 있게 된다.
  • 즉, 이름, 타입 및 기본 선언(Query, Path 등)으로 매개변수를 자동으로 감지하기 때문에 순서는 신경쓰지 않아도 된다.


  • 따라서 원래는 문법에 맞게 다음과 같이 작성해야만 한다.


from fastapi import FastAPI, Path, Query

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
    q: str, item_id: int = Path(..., title="The ID of the item to get")
):
    results = {"item_id": item_id}

    if q:
        results.update({"q": q})

    return results


5. Order the parameters as you need, tricks

  • Query나 기본값 없이 query 매개변수 q를 선언하고, Path를 사용하여 path 매개변수 item_id를 선언하여 다른 순서를 지정하려는 경우, Python의 특별한 구문인 *를 전달하면 된다.
  • Python은 * 자체로는 아무것도 하지 않을 것이지만, * 다음에 오는 모든 매개변수는 kwargs라고 하는 키워드 인수(키-값 쌍)로 호출되어야 한다는 것을 알게 된다.
  • 이때 기본값이 없는 경우에도 마찬가지로 적용된다.


from fastapi import FastAPI, Path, Query

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
    *, item_id: int = Path(..., title="The ID of the item to get"), q: str
):
    results = {"item_id": item_id}

    if q:
        results.update({"q": q})

    return results


6. Number validations: greater than or equal

  • QueryPath를 사용하여 문자열 제약뿐만 아니라 숫자 제약도 걸 수 있다.


  • 다음의 예제는 ge=1일 때, item_id는 1보다 크거나 같은 정수여야 한다는 제약을 거는 예제이다.


from fastapi import FastAPI, Path, Query

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
    *, item_id: 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


7. Number validations: greater than an less than or equal

  • 위의 예제에서 쓰인 ge 외에도 다음과 같은 매개변수가 존재한다.


1] gt

  • 보다 크다.

2] le

  • 작거나 같다.

3] lt

  • 보다 작다.


from fastapi import FastAPI, Path, Query

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
    *,
    item_id: int = Path(..., title="The ID of the item to get", gt=0, le=1000),
    q: str
):
    results = {"item_id": item_id}

    if q:
        results.update({"q": q})

    return results


8. Number validations: floats, greater than and less than

  • 숫자 유효성 검사는 float 값에도 적용된다.
  • float 값 유효성 검사에서는 ge뿐만 아니라 gt를 선언할 수 있는 것이 중요하다.
  • 그 이유는 값이 1보다 작더라도 값이 0보다 커야 한다고 요구할 수 있기 때문이다.


  • 다음의 예제 gtlt를 함께 사용하는 예제이다.


from fastapi import FastAPI, Path, Query

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
    *,
    item_id: int = Path(..., title="The ID of the item to get", ge=0, le=1000),
    q: str,
    size: float = Query(..., gt=0, lt=10.5)
):
    results = {"item_id": item_id}

    if q:
        results.update({"q": q})

    return results

References