FastAPI Query Parameters and String Validations

snooby·2022년 8월 19일
3

⚒ Python

목록 보기
6/14
post-thumbnail

Fast API를 사용하면 매개 변수에 대한 추가 정보 및 유효성 검사를 선언할 수 있습니다.

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/")
async def read_items(q: Union[str, None] = None):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

쿼리 매개 변수 q는 Union[str, None](또는 Python 3.10에서는 str 없음) 유형입니다. 즉, str 유형이지만 없음일 수도 있으며 실제로 기본값은 없음입니다.

추가 유효성 검사

q가 필수가 아니고 선택사항이지만, q가 들어올 때마다 유효성 검사를 지정해보겠습니다.

q가 제공될 때마다 길이가 50자 초과하지 않도록 예시를 진행해보겠습니다.

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, max_length=50)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

유효성을 지정할 q(Union)변수에 = Query(default=None, 유효성) 으로 지정합니다.


4글자인 test 변수를 넣으면 결과창에 보이듯 q: "test"를 추가하였고,

50글자 이상을 지정하면 진행되지 않습니다.

추가 유효성 검사 사항은 1개 이상 지정할 수 있습니다.

@app.get("/items/")
async def read_items(
    q: Union[str, None] = Query(default=None, min_length=3, max_length=50)
):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

정규표현식 유효성 검사

파라미터가 지정된 정규표현식을 따르는지 검사하는 유효성 검사도 추가할 수 있습니다.

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(
    q: Union[str, None] = Query(
        default=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

다음 정규표현식은 regex="^fixedquery$" -> fixedquery여야만 한다는 것입니다.

fixedquery를 인자로 넘기면 잘 되지만 이외의 문자는 오류에 잡힘을 볼 수 있습니다.

변수 기본값 지정

앞서서 변수를 필수 값은 아닌 것으로 default=None을 정의했지만,
필수값은 아니나 값이 안들어오면 default로 정의된 값을 따르도록 하는 default values를 정의할 수도 있습니다.

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: str = Query(default="fixedquery", min_length=3)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results


fastAPI docs를 들어가면 기본인자로 바로 지정되어 있는 것을 볼 수 있습니다.

필수 매개변수 지정

1. Ellipsis (...)

값이 필수로 들어가야한다는 점을 표현하는 방식이 ... 입니다.

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: str = Query(default=..., min_length=3)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

쿼리 매개변수에 default=...로 정의하면 API 통신 시, 매개변수를 넘기지 않으며 통신이 되지 않습니다.

2. Required

Elipsis 뿐만 아니라 Required를 사용해서도 필수 매개변수를 정의할 수 있습니다.

from fastapi import FastAPI, Query
from pydantic import Required

app = FastAPI()


@app.get("/items/")
async def read_items(q: str = Query(default=Required, min_length=3)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

매개변수 여러개 넘기기

한개의 변수에 여러개의 값을 넘기게 할 수도 있습니다.

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: list[str] | None = Query(default=None)):
    query_items = {"q": q}
    return query_items

http://localhost:8000/items/?q=foo&q=bar
이렇게 여러개 값을 한개의 변수에 넘길 수 있습니다.

위에서 배운 방법을 사용하여 default값도 정의할 수 있습니다.

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: list[str] = Query(default=["foo", "bar"])):
    query_items = {"q": q}
    return query_items

http://localhost:8000/items/
로 들어가보면 q 인자가 foo, bar 2개가 정의되어 있는 것을 알 수 있습니다.

profile
데이터를 가치있게 다루고 싶은 개발자 🐥

0개의 댓글