Victoree's Blog

[3] Fast API Basic - Response 편 본문

Python/Fast API

[3] Fast API Basic - Response 편

victoree 2021. 7. 20. 15:45
728x90

1. Response Model

1) Response Model Basic

  • 아래와 같은 함수의 response_model 옵션으로 원하는 모델을 설정하면 된다
    • @app.get()
    • @app.post()
    • @app.put()
    • @app.delete()
    • etc.
  • 출력 데이터를 해당 객체로 변환
  • 데이터 벨리데이션 수행
  • 오픈 API 경로 작업에서 응답에 대한 JSON 스키마 추가
  • 자동 문서화 시스템에 사용됨
  • 출력 데이터를 모델의 데이터로 제한

2) Model In/Out

  • password 같이 리턴되지 말아야하는 값은 UserOut이라는 클래스를 명시적으로 작성하여,
    리턴될 때 해당 객체에 정의된 필드만 리턴되도록 구현할 수 있다.
class UserIn(BaseModel):
    username: str
    password: str
    email: EmailStr
    full_name: Optional[str] = None

class UserOut(BaseModel):
    username: str
    email: EmailStr
    full_name: Optional[str] = None

@app.post("/user/", response_model=UserOut)
async def create_user(user: UserIn):
    return user

3) response_model include/exclude

  • 클래스 두개를 정리하는 것말고, 그냥 특정 클래스에 어떤 것만 추가하고 뺄지만 작성하고 싶을 땐!
    간단히 옵션만 작성할 수 있음
@app.get(
    "/users/{user_id}/name",
    response_model=User,
    response_model_include=["username", "email"],
    response_model_exclude=["password"]
)

2. Response Status

from fastapi import FastAPI, status

app = FastAPI()

@app.post("/items/", status_code=status.HTTP_201_CREATED)
async def create_item(name: str):
    return {"name": name}

3. Response Union or AnyOf

  • response_model로 정의된 것들 중에 맞는 타입으로 리턴됨
class BaseItem(BaseModel):
    description: str
    type: str

class CarItem(BaseItem):
    type = "car"

class PlaneItem(BaseItem):
    type = "plane"
    size: int

items = {
    "item1": {"description": "All my friends drive a low rider", "type": "car"},
    "item2": {
        "description": "Music is my aeroplane, it's my aeroplane",
        "type": "plane",
        "size": 5,
    },
}

@app.get("/items/{item_id}", response_model=Union[PlaneItem, CarItem])
async def read_item(item_id: str):
    return items[item_id]

4. Error

from fastapi import FastAPI, **HTTPException**

app = FastAPI()

items = {"foo": "The Foo Wrestlers"}

@app.get("/items/{item_id}")
async def read_item(item_id: str):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item": items[item_id]}

5. API Docs

1) Tags

@app.get("/users/", tags=["users"]) # api의 테그를 딸 수 있음

2) Description

@app.post("/items/", response_model=Item, tags=["default"], 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

728x90
Comments