본문 바로가기

FastAPI

07. Fast API, Query Parameters and String Validation(유효성 검사)

728x90

이전에 봤었던 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

Query Parameter List / Multiple values

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로 바뀌어서 들어오게 된다.


Declare More Metadata

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

Alias Parameters

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으로 요청을 보내면 된다.


Deprecating parameters

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 콜은 정상적으로 이루어진다.

728x90