728x90
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
300x250
'Programming Language > Python' 카테고리의 다른 글
[FastAPI] 8. Fields (0) | 2024.06.19 |
---|---|
[FastAPI] 7. Body Parameter (0) | 2024.06.19 |
[FastAPI] 5. Query Parameters(Annotated, Query) (0) | 2024.06.19 |
[FastAPI] 4. Request Body (0) | 2024.06.19 |
[FastAPI] 3. 쿼리 매개변수(Query Parameters) (1) | 2024.06.18 |