Post

FastAPI 공식문서 따라하기[23] - Path Operation Configuration

https://fastapi.tiangolo.com/tutorial/handling-errors/ 공식문서 따라하는 글

☑️ Path Operation Configuration

Path 경로에 몇 가지 기능을 더 넣을 수 있다고 한다.

☑️ Response Status Code

status_code를 이용하여 HTTP상태코드를 전다할 수 있다.

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

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None
    tags: set[str] = set()


@app.post("/items/", response_model=Item, status_code=status.HTTP_201_CREATED)
async def create_item(item: Item):
    return item

이렇게 작성하고, post요청에 성공하면 201 HTTP상태값을 받을 수 있다.

참고로 import statusfastapi에서 하나 starlette에서 하나 같다.

☑️ Tags

liststr형태의 tagsPassParameter에 넘길 수 있다.

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
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None
    tags: set[str] = set()


@app.post("/items/", response_model=Item, tags=["items"])
async def create_item(item: Item):
    return item


@app.get("/items/", tags=["items"])
async def read_items():
    return [{"name": "Foo", "price": 42}]


@app.get("/users/", tags=["users"])
async def read_users():
    return [{"username": "johndoe"}]

보면 tags지정한대로 분리해서 OpenAPI 인터페이스에 나타나는걸 볼 수 있다.

또한, 큰 애플리케이션의 경우 Tags를 매번 지정하다간 헷갈릴수도 있고 하나로 관리하고 싶기에

Enum을 사용해서 나타낼 수도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from enum import Enum

from fastapi import FastAPI

app = FastAPI()


class Tags(Enum):
    items = "items"
    users = "users"


@app.get("/items/", tags=[Tags.items])
async def get_items():
    return ["Portal gun", "Plumbus"]


@app.get("/users/", tags=[Tags.users])
async def read_users():
    return ["Rick", "Morty"]

☑️ Summary and description

summarydescription도 파라미터에서 사용할 수 있는데 이는 무엇이냐..

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
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None
    tags: set[str] = set()


@app.post(
    "/items/",
    response_model=Item,
    summary="Create an item",
    description="Create an item with all the information, name, description, price, tax and a set of unique tags",
)
async def create_item(item: Item):
    return item

이렇게 설명과 간단한 타이틀을 설정할 수 있다.

또한 markdown스타일로 설명을 적을 수 있다고 한다.

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
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None
    tags: set[str] = set()


@app.post("/items/", response_model=Item, summary="Create an item")
async def create_item(item: Item):
    """
    Create an item with all the information:

    - **name**: each item must have a name
    - **description**: a long description
    - **price**: required
    - **tax**: if the item doesn't have tax, you can omit this
    - **tags**: a set of unique tag strings for this item
    """
    return item

☑️ Response description

response_description을 통해 response description을 명시해줄 수 있다.

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

app = FastAPI()


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


@app.post(
    "/items/",
    response_model=Item,
    response_description="The created item",
)
async def create_item(item: Item):
    return item

☑️ Deprecate a path operation

deprecated를 명시하여 해당 라우터의 기능을 사용하지 않는다고 명시할 수 있다.

1
2
3
4
5
6
7
8
9
from fastapi import FastAPI

app = FastAPI()


@app.get("/elements/", tags=["items"], deprecated=True)
async def read_elements():
    return [{"item_id": "Foo"}]

하지만 요청을 하면 잘간다.

OpenAPI에서 명시적으로 나타내주기 위해 사용하는 것 같다.

This post is licensed under CC BY 4.0 by the author.