본문 바로가기
Fast API/fastapi배우기

Fast API 배우기 4부 - Query 클래스

by 붕어사랑 티스토리 2021. 10. 20.
반응형

이번시간에는 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 라고 뜬다.

반응형

댓글