이번에는 Fast API에서 Query Parameter를 지정하는 방법을 살펴보겠습니다.
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
return fake_items_db[skip : skip + limit]
>>>
http://127.0.0.1:8000/items/?skip=0&limit=10
flask에서는 Query Parameter를 받기 위해서 따로 request
객체를 통해 받아야 하지만
# Flask
skip = request.args.get("skip", 0, int)
limit = request.args.get("limit", 10, int)
따로 Path Parameter로 지정하지 않은 매개변수에 대해서는 Query Parameter로 선언되어 작동합니다. 매개변수는 기본적으로 str
타입이지만, 파이썬 타입과 함께 선언한 경우 해당 타입으로 변환되고 이에 대해 검증합니다. 또한 위 처럼 기본값을 지정할 수도 있습니다.
# 모두 같은 동작
http://127.0.0.1:8000/items/
http://127.0.0.1:8000/items/?skip=0&limit=10
http://127.0.0.1:8000/items/?skip=10
같은 방법으로 기본값을 None
으로 설정하여 선택적 매개변수를 선언할 수 있습니다.
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
위의 경우 매개변수 q
는 선택적이고 기본값으로 None
을 갖습니다.
위의 경우
item_id
는 Path Parameter,q
는 Query Parameter
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return item
Query Parameter는 bool
형으로 선언할 수도 있고, 아래의 경우 처럼 형변환도 지원됩니다.
http://127.0.0.1:8000/items/foo?short=1
http://127.0.0.1:8000/items/foo?short=True
http://127.0.0.1:8000/items/foo?short=true
http://127.0.0.1:8000/items/foo?short=on
http://127.0.0.1:8000/items/foo?short=yes
또는 다른 어떤 변형 (대문자, 첫글자만 대문자)이더라도 함수는 매개변수 bool
형을 가진 short
의 값이 True
로 형변환됩니다. 그렇지 않은 경우는 False
입니다.
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
user_id: int, item_id: str, q: Optional[str] = None, short: bool = False
):
item = {"item_id": item_id, "owner_id": user_id}
if q:
item.update({"q": q})
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return item
여러 Path Parameter와 Query Parameter를 동시에 선언할 수 있고, 특정 순서로 선언할 필요는 없습니다. 매개변수의 이름으로 감지되어 작동합니다.
# Path Parameter
user_id, item_id
# Query Parameter
q, short
만약 Query Parameter를 필수 파라미터로 지정하고 싶다면, 당연하게도 기본값을 설정하지 않으면 됩니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str):
item = {"item_id": item_id, "needy": needy}
return item