Programming Language/Python

[FastAPI] 6. Path Parameters (Annotated, Path, *)

LeeJaeJun 2024. 6. 19. 19:04
728x90
반응형

Annotated와 Path

from typing import Annotated, Union

from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    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
  • path parameter의 경우 Path를 통해 유효성 검사과 추가 메타 데이터를 설정 가능
    • Query에서 사용했던 parameter들 모두 그대로 사용 가능
    • 둘의 차이는 query parameter가 아닌 path parameter를 대상으로 할 뿐이란 것
  • 파이썬은 기본 값이 없는 파라미터를 기본 값이 있는 파라미터보다 먼저 선언해야 하지만, FastAPI는 Annotated와 함께 선언한 경우 변수 이름이나 Query, Path와 같은 default declarations에 따라 자동으로 처리하기 때문에 신경쓰지 않아도 됨
    •  Annotated를 사용하지 않았다면 순서를 신경써서 선언해야 함
# Annotated를 사용하지 않으면 순서 고려
from fastapi import FastAPI, Path

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
# Annotated를 사용하면 순서 상관 x
from typing import Annotated
from fastapi import FastAPI, Path

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
    item_id: Annotated[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
  • Annotated를 사용하지 않고 순서를 다르게 하고 싶으면 파이썬 특수 문법 *를 사용
    • 함수의 첫 번째 파라미터로 *를 전달하여, 이후 모든 파라미터를 키워드 인수로 취급하도록 함
    • 즉, 인자를 전달할 때 값만 전달해도 순서에 맞게 값이 들어가던 방식과 다르게, 해당 값이 어느 변수에 해당하는 지도 같이 전달하여야 함
@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

# 호출 예시
read_items(item_id=123, q="example")

 

728x90
반응형