이번시간에는 Query Parameter를 좀더 심도있게 다뤄보자.
심도있게 다룬다는 말은 쿼리파라미터에 본래모습을 학습하고 여러 기능을 사용해보자는 의미
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = None):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
위 예제에서는 q가 쿼리 파라미터이고 Optional인 상황이다
Query 클래스
쿼리 파라미터를 심도있게 다루기 위해서는 Query 클래스를 import 해야 한다
from fastapi import FastAPI, Query
이 Query 클래스는 Query 파라미터를 다루는 클래스라고 생각하면 될 것이다.
Query 클래스를 이용하여 max_length 50으로 제한하기
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
위 예제에서 q의 default value로 Query 객체를 넘겨주었다
Query(None, max_length=50)
해당 코드의 첫번째는 default valute이다. 즉 q는 기본적으로 None값을 가지므로 Optional이다
max_length=50은 만약 q에 데이터가 들어올 경우 string의 최대 길이를 50으로 제한한다는 의미이다
지금 위 예제를 보고 아래처럼 이해 할 수 있을것이다
q: Optional[str] = Query(None)
위코드는 아래와 같다
q: Optional[str] = None
다만 차이점이라면 Query 파라미터라고 명시적으로 지정해 준 것과 여러가지 Query parameter의 기능을 사용 할 수 있다는 점
min_length 추가하기
min_length 라는 파라미터로 q값의 최소 길이도 지정해 줄 수 있다
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, min_length=3, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
위 예제는 min_length가 3으로 지정된 예제로 q에 값이 들어오면 최소 3자 최대 50자의 데이터가 들어와야 한다
Query 파미터를 정규식으로 제한하기
regex 파라미터에 정규식 format을 주면 q값을 정규식으로 제한 할 수 있다
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(
q: Optional[str] = Query(None, min_length=3, max_length=50, regex="^fixedquery$")
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
- ^ : 뒤에나오는 문자로 시작한다. 즉 q값은 무조건 fixedquery로 시작함
- $ : 정규식의 끝마침. 이 뒤로 문자가 올 수 없다
즉 위 예제에서는 q값을 fixedquery라고 밖에 주지 못한다
Default Value 값 지정하기
Query에서 default valute 값 지정하는 방법은 None을 넣어준것 처럼 Query 생성할때 첫번째 파라미터에 default 값을 넣으면 된다
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query("fixedquery", min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
Query Parameter required로 만드는법
앞서 배운걸 먼저 복습해보자. 별다른 validation이나 metadata가 필요하지 않다면 앞서 배운것 처럼 required는 default 값을 주지 않으면 required로 선언된다
q: str
Query 클래스로 하는 방법은 Query class의 default value로 ... 을 넣어주면 된다
q: str = Query(..., min_length=3)
from fastapi import FastAPI, Query
app = FastAPI()
@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 Value를 Query 파라미터로 사용하기
Query 클래스를 이용하면 List를 Query 파라미터로 사용 할 수 있다
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
그리고 아래와 같은 url로 요청하면 여러개의 값을 줄 수 있다
http://localhost:8000/items/?q=foo&q=bar
그럼 위 예제에서 reponse는 아래와 같이 나온다
{
"q": [
"foo",
"bar"
]
}
API 사이트에서도 여러개의 값을 추가하는 모습을 볼 수 있으니 한번 해보자
List값을 Default Value로 주고싶으면 아래와 같이 해보면 된다
from typing import List
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: List[str] = Query(["foo", "bar"])):
query_items = {"q": q}
return query_items
또하나 팁을 주자면 아래와같이 List[str]말고 그냥 list 자료형도 써서 사용 가능하다
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: list = Query([])):
query_items = {"q": q}
return query_items
Metadata 추가하기
title, description 키워드로 쿼리에 대한 설명을 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
Alias Parameter, 별명 파라미터
쿼리 파라미터로 item-query 라는 파라미터로 보내고싶다고 치다.
허나 item-query는 파이썬의 변수명으로 사용이 불가능하다.
하지만 fast API는 alias parameter를 통해 이를 가능케 한다.
아래처럼 Query를 선언할 때 alias value에 값을 넣어주면 된다
q: Optional[str] = Query(None, alias="item-query")
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@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
Deprecated 표시하기
만약 어떤 파라미터를 업데이트하거나 관리하기 싫다고 하자
하지만 그 파리미터를 삭제하면 안된다. 그걸 쓰는 유저들이 있을테니
그럴때 deprecated를 표시해주면 된다
아래처럼 Query를 선언 해 줄 때 deprecated=True를 해주자
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@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
API 사이트에 들어가보면 아래처럼 deprecated 라고 뜬다.
'Fast API > fastapi배우기' 카테고리의 다른 글
Fast API 배우기 6부 - Body 클래스 (0) | 2021.10.21 |
---|---|
Fast API 배우기 5부 - Path 클래스 (0) | 2021.10.21 |
Fast API 배우기 3부 - Request Body (0) | 2021.10.20 |
Fast API 배우기 2부 - query parameters (0) | 2021.10.19 |
Fast API 배우기 1부 - 시작 및 path parameter (0) | 2021.10.18 |
댓글