경로 조작 설정 (Path Operation Configuration)

경로 조작 설정 (Path Operation Configuration)

_경로 조작 데코레이터_에 넘겨서 동작을 설정할 수 있는 매개변수가 몇 가지 있어요. 이 페이지에서 하나씩 살펴볼게요.

주의

이 매개변수들은 _경로 조작 함수_가 아니라 **경로 조작 데코레이터**에 직접 전달된다는 점을 꼭 기억하세요.

응답 상태 코드 (Response Status Code)

_경로 조작_의 응답에 사용할 (HTTP) status_code를 직접 지정할 수 있어요.

404처럼 숫자 int 코드를 그대로 넘겨도 돼요. 그런데 각 번호가 뭘 의미하는지 매번 기억하기 어렵다면, status에 준비된 상수(shortcut constant)를 쓰면 훨씬 편해요.

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/", status_code=status.HTTP_201_CREATED)
async def create_item(item: Item) -> Item:
    return item

이 상태 코드는 응답에 사용되고, OpenAPI 스키마에도 함께 추가돼요.

기술 세부사항

from starlette import status로 가져와서 써도 돼요.

FastAPI는 개발자 편의를 위해 starlette.status와 같은 값을 fastapi.status로도 제공할 뿐이에요. 실제로는 Starlette에서 온 거예요.

태그 (Tags)

_경로 조작_에 태그를 추가할 수 있어요. tags 매개변수에 strlist를 넘기면 되는데, 보통은 str 하나만 담아서 넘겨요.

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/", tags=["items"])
async def create_item(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"}]

태그는 OpenAPI 스키마에 추가되고, 자동 문서 인터페이스에서도 사용돼요.

Enum으로 태그 관리하기 (Tags with Enums)

앱이 커지다 보면 태그가 여러 개 쌓일 수 있어요. 관련된 _경로 조작_에는 항상 같은 태그를 쓰고 싶을 때가 많은데요, 그럴 때는 태그를 Enum으로 정리해 두는 게 한 가지 방법이에요.

FastAPI는 일반 문자열과 똑같은 방식으로 Enum 태그를 지원해요.

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을 추가할 수 있어요.

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/",
    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) -> Item:
    return item

docstring에서 설명 가져오기 (Description from docstring)

설명은 길어지고 여러 줄에 걸치는 경우가 많아요. 그럴 때는 함수의 docstring에 경로 조작 설명을 적어 두면 FastAPI가 거기서 읽어와요.

docstring 안에는 Markdown을 쓸 수 있고, 해석되어 올바르게 표시돼요. (docstring의 들여쓰기도 고려해요.)

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/", summary="Create an item")
async def create_item(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

이 내용은 대화형 문서(interactive docs)에서 사용돼요.

응답 설명 (Response description)

응답에 대한 설명은 response_description 매개변수로 지정할 수 있어요.

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/",
    summary="Create an item",
    response_description="The created item",
)
async def create_item(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는 말 그대로 응답에 대한 설명이고, description경로 조작 자체에 대한 설명이에요. 둘은 가리키는 대상이 달라요.

OpenAPI 명세는 각 _경로 조작_이 응답 설명을 반드시 가지도록 요구해요. 그래서 따로 지정하지 않으면 FastAPI가 자동으로 "Successful response"라는 응답 설명을 만들어 넣어요.

경로 조작 폐기하기 (Deprecate a path operation)

_경로 조작_을 실제로 제거하지는 않고 '더 이상 쓰지 않음(deprecated)'으로 표시하고 싶을 때가 있어요. 그럴 때 deprecated 매개변수를 넘기면 돼요.

from fastapi import FastAPI

app = FastAPI()

@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"}]

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

대화형 문서에서 이 _경로 조작_은 명확하게 'deprecated'로 표시돼요.

정리 (Recap)

_경로 조작 데코레이터_에 매개변수를 넘기기만 하면, _경로 조작_을 쉽게 설정하고 메타데이터를 추가할 수 있어요.