반응형
앞서 Query 클래스로 Query Parameter를 다루는법을 배웠다
똑같에 Path 클래스로 Path Parameter를 좀더 심도있게 다룰 수 있다
Metadata 선언하기
Query와 똑같이 title 에 메타데이터를 넣어주면 된다
item_id: int = Path(..., title="The ID of the item to get"),
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
숫자 제한하기
Query와 Path 는 앞서 배운 강의에서 문자열 기일이도 제한할 수 있지만 숫자도 제한할 수 있다.
다음은 우리가 배울 내용이다
- ge : greater than or equal, 크거나 같다
- gt : greater than, 크다
- lt : less than, 작다
- le : less than or equal, 작거나 같다
from fastapi import FastAPI, Path
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
from fastapi import FastAPI, Path
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
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
반응형
원하는대로 파라미터 순서 정하기
(개 쓸데없는 내용이고 알아도 비 실용적이므로 다음으로 넘어가는거 추천)
상황을 가정하자
당신이 q:str 변수를 쿼리 파라미터로 쓰려고 한다
별다른 메타데이터도 필요 없어서 Query 클래스를 사용하지 않을거다
그리고 당신은 item_id 라는 Path parameter를 Path 클래스로 선언하려고 한다
그러면 다음과 같은 문제가 생긴다.
파이썬에서는 함수인자에서 default value를 가진 변수가 default value를 가지지 않은 변수보다 앞에오면 에러를 일으킨다.
예를들면
def func(a=10,b): => 에러
def func(a,b=10) => OK
위와 같은 상황이 발생한다. 고로 당신은 위의 예제에서 q를 item_id보다 먼저 앞에 둬야한다
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
하지만 당신이 q를 뒤로 보내고 싶다면?
정답은 * 인자를 함수 맨 앞으로 놓으면 된다.
from fastapi import FastAPI, Path
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
하지만 단점이 있다. * 뒤에 오는 변수들은 key-value로 인자를 넣어줘야 한다.
반응형
'Fast API > fastapi배우기' 카테고리의 다른 글
Fast API 배우기 7부 - Field 클래스 (5) | 2021.11.01 |
---|---|
Fast API 배우기 6부 - Body 클래스 (0) | 2021.10.21 |
Fast API 배우기 4부 - Query 클래스 (0) | 2021.10.20 |
Fast API 배우기 3부 - Request Body (0) | 2021.10.20 |
Fast API 배우기 2부 - query parameters (0) | 2021.10.19 |
댓글