Fast API 사용해보기 - Query Parameter

JinWooHyun·2021년 8월 17일
0

Fast API 프로젝트

목록 보기
3/6

이번에는 Fast API에서 Query Parameter를 지정하는 방법을 살펴보겠습니다.

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]
    
    
>>>
http://127.0.0.1:8000/items/?skip=0&limit=10

flask에서는 Query Parameter를 받기 위해서 따로 request 객체를 통해 받아야 하지만

# Flask
skip = request.args.get("skip", 0, int)
limit = request.args.get("limit", 10, int)

따로 Path Parameter로 지정하지 않은 매개변수에 대해서는 Query Parameter로 선언되어 작동합니다. 매개변수는 기본적으로 str 타입이지만, 파이썬 타입과 함께 선언한 경우 해당 타입으로 변환되고 이에 대해 검증합니다. 또한 위 처럼 기본값을 지정할 수도 있습니다.

# 모두 같은 동작
http://127.0.0.1:8000/items/
http://127.0.0.1:8000/items/?skip=0&limit=10
http://127.0.0.1:8000/items/?skip=10

같은 방법으로 기본값을 None으로 설정하여 선택적 매개변수를 선언할 수 있습니다.

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None):
    if q:
        return {"item_id": item_id, "q": q}
    return {"item_id": item_id}

위의 경우 매개변수 q는 선택적이고 기본값으로 None을 갖습니다.

위의 경우 item_id는 Path Parameter, q는 Query Parameter

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")

async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):

    item = {"item_id": item_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item

Query Parameter는 bool 형으로 선언할 수도 있고, 아래의 경우 처럼 형변환도 지원됩니다.

http://127.0.0.1:8000/items/foo?short=1
http://127.0.0.1:8000/items/foo?short=True
http://127.0.0.1:8000/items/foo?short=true
http://127.0.0.1:8000/items/foo?short=on
http://127.0.0.1:8000/items/foo?short=yes

또는 다른 어떤 변형 (대문자, 첫글자만 대문자)이더라도 함수는 매개변수 bool 형을 가진 short의 값이 True로 형변환됩니다. 그렇지 않은 경우는 False 입니다.

from typing import Optional

from fastapi import FastAPI

app = FastAPI()



@app.get("/users/{user_id}/items/{item_id}")

async def read_user_item(

    user_id: int, item_id: str, q: Optional[str] = None, short: bool = False

):
    item = {"item_id": item_id, "owner_id": user_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item

여러 Path Parameter와 Query Parameter를 동시에 선언할 수 있고, 특정 순서로 선언할 필요는 없습니다. 매개변수의 이름으로 감지되어 작동합니다.

# Path Parameter
user_id, item_id

# Query Parameter
q, short

만약 Query Parameter를 필수 파라미터로 지정하고 싶다면, 당연하게도 기본값을 설정하지 않으면 됩니다.

from fastapi import FastAPI

app = FastAPI()



@app.get("/items/{item_id}")

async def read_user_item(item_id: str, needy: str):

    item = {"item_id": item_id, "needy": needy}
    return item
profile
Unicorn Developer

0개의 댓글