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

Junha Kim·2021년 1월 4일
1

FastAPI

목록 보기
8/16

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

0개의 댓글