이전에 봤었던 Query Parameter에서 Optional한 경우에, 값이 주어지지 않아도 되었었다. 하지만 만약 값이 주어졌을 때, Fast API에서는 추가적인 유효성 검사를 할 수 있다.
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
Optional Parameter인 q
에 대해, 값이 주어졌을 때 max length를 50자로 제한하는 상황이다.
fastapi
에서 Query
를 import한 후, Default 값으로 Query(default_value, min_length=3, max_length=50, regex="^fixedquery$")
과 같이 설정해주면 된다.
만약 Optional Parameter가 아닌 Required Parameter로 설정하고 싶다면(Default value를 주고싶지 않다면), 아래와 같이 Query 객체를 생성하면 된다.
@app.get("/items/")
async def read_items(q: str = Query(..., min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
List 값을 받고 싶으면 아래와 같이 설정하면 된다.
from typing import List, Optional
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[List[str]] = Query(None)):
query_items = {"q": q}
return query_items
위와 같이 q
를 string으로 이루어진 List를 받겠다고 선언을 하고 난 후, /items/?q=foo&q=bar
과 같이 URL 요청을 보내면 된다.
응답 결과는 아래와 같다.
{
"q": [
"foo",
"bar"
]
}
Query Parameter를 List 타입으로 선언할 때는 명시적으로 Query
객체를 쓰는 것이 좋다고 한다. 그렇지 않으면 Request Body로 인식될 수도 있다고 한다.
@app.get("/items/")
async def read_items(q: list = Query([])):
query_items = {"q": q}
return query_items
이 경우에는 List[str]
과 같은 형태가 아닌, list로만 선언을 하였을 땐, list 안의 요소가 어떤 것이든 체크를 하지 않는다는 것이다.
list 안의 값은 모두 str
로 바뀌어서 들어오게 된다.
Query 객체에 Parameter를 추가하여 더 많은 metadata를 추가할 수 있다.
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(
q: Optional[str] = Query(
None,
title="Query string",
description="Query string for the items to search in the database that have a good match",
min_length=3,
)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
URL에서 따로 쓰고싶은 Alias가 있다면 아래와 같이 하면 된다.
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, alias="item-query")):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
위와 같이 선언을 하고, items/?item-query=foobaritems
으로 요청을 보내면 된다.
docs 상에 parameter를 더이상 쓰지 않겠다고 보여주기 위해서, Query객체에 decrecated 변수가 존재한다.
@app.get("/items/")
async def read_items(
q: Optional[str] = Query(
None,
alias="item-query",
title="Query string",
description="Query string for the items to search in the database that have a good match",
min_length=3,
max_length=50,
regex="^fixedquery$",
deprecated=True,
)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
하지만 이는 docs상에 deprecated라고 명시될 뿐, API 콜은 정상적으로 이루어진다.