Post

FastAPI 공식문서 따라하기[8] - Body Multiple Parameters

https://fastapi.tiangolo.com/ko/ 공식문서 따라하는 글

☑️ 1. Body Multiple Parameters

RequestBody값에 PathQuery를 적용해볼 것이다.

다음 예제는 QueryParameterPathParameterRequestBody를 같이 사용하는 예제다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from fastapi import FastAPI, Path
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


@app.put("/items/{item_id}")
async def update_item(
    *,
    item_id: int = Path(..., title="The ID of the item to get", ge=0, le=1000),
    q: str | None = None,
    item: Item | None = None,
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    if item:
        results.update({"item": item})
    return results

위의 코드에서 itemNone을 default value로 받을 수 있다는 것에 주목하자.


☑️ 2. Multiple body parameters

이번에는 RequestBody에 여러 객체가 들어온다고 가정을 했을때 받아오는지 확인하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from fastapi import FastAPI, Path
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None

class User(BaseModel):
    username: str
    full_name: str | None = None

@app.put("/items/{item_id}")
async def update_item(item_id : int, item: Item, user:User):
    results = {"item_id" : item_id}
    if q:
        results.update({"q":q})
    if item:
        results.update({"item": item})
    return results

결과

Input

result

  • FastAPI는 자동으로 요청 파라미터값을 검사해서 알맞은 자료형으로 바꿔준다. 이러한 데이터의 유효성 검사를 수행하고 OpenAPI와 같이 문서화한다.

☑️ 3. Singular values in body

  • QueryParameter에서는 Query로, PathParameter에서는 Path로 제어했듯이 RequestBodyBody로 제어한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


class User(BaseModel):
    username: str
    full_name: str | None = None


@app.put("/items/{item_id}")
async def update_item(
    item_id: int, item: Item, user: User, importance: int = Body(...)
):
    results = {"item_id": item_id, "item": item, "user": user, "importance": importance}
    return results

importance라는 변수에 Body(...)라는 구문을 줘서 해당 변수가 RequestBody에 포함된 값임을 명시한다. 만약 사용하지 않는다면 QueryParameter로 인지할 것이다. 즉, 해당 구문을 사용하면 data types, validate, document에 대한 정보를 변환한다.


☑️ 4. Multiple body params and query

추가적으로 Query를 명시하지 않아도 RequestBody와 함께 쓴다면 singular values는 자동으로 QueryParameter로 해석한다는 내용이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


class User(BaseModel):
    username: str
    full_name: str | None = None


@app.put("/items/{item_id}")
async def update_item(
    *,
    item_id: int,
    item: Item,
    user: User,
    importance: int = Body(..., gt=0),
    q: str | None = None
):
    results = {"item_id": item_id, "item": item, "user": user, "importance": importance}
    if q:
        results.update({"q": q})
    return results

OpenAPI(Swagger)에서 테스트가 가능하다.

Body를 보면 gt=0과 같이 추가적인 validation이 가능하다.


☑️ 5. Embed a single body parameter

만약 RequestBody내에 객체가 하나라면 FastAPI는 따로 key값을 요청하지 않는다.

예를 들면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(...)):
    results = {"item_id": item_id, "item": item}
    return results

이렇게 Item이 하나만 들어온다하면,

RequestBody

1
2
3
4
5
6
7
{
    "name": "Foo",
    "description": "The pretender",
    "price": 42.0,
    "tax": 3.2
}

이렇게 요청을 보내야하지만, 만약 내가 key을 명시한것을 요청으로 받고 싶다면 embed=True구문을 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(..., embed=True)):
    results = {"item_id": item_id, "item": item}
    return results

이렇게 embed=True를 입력하면

1
2
3
4
5
6
7
8
9
{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    }
}

이렇게 body를 만들어서 보내야한다. 이렇게 보내지 않으면 error를 발생시킨다.


☑️ 정리

  • 경로에 여러 bodyParameter를 선언하는 방법
  • singular valuesbody데이터로 받는 방법
  • embed를 이용하여 key값으로 요청 받는 방법
This post is licensed under CC BY 4.0 by the author.