7. Path Parameters and Numeric Validations
1. Path Parameters and Numeric Validations
Query
를 사용하여 query 매개변수에 대해 더 많은 유효성 검사 및 메타데이터를 선언할 수 있는 것과 같은 방식으로,Path
를 사용하여 path 매개변수에 대해 동일한 타입의 유효성 검사 및 메타데이터를 선언할 수 있다.
2. Import Path
- 먼저,
fastapi
의Path
를 임포트한다.
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
Query
및Path
를 사용하여 문자열 제약뿐만 아니라 숫자 제약도 걸 수 있다.
- 다음의 예제는
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보다 커야 한다고 요구할 수 있기 때문이다.
- 다음의 예제
gt
와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", 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