본문 바로가기

개발하자

FastAPI/OpenAPI에서 여러 응답 모델을 사용할 수 있는 방법이 있습니까?

반응형

FastAPI/OpenAPI에서 여러 응답 모델을 사용할 수 있는 방법이 있습니까?

나는 논리에 따라 완전히 다른 두 개의 반응 구조를 가져야 하는 앱을 쓰고 있다.

두 개의 서로 다른 응답 모델을 직렬화, 검증 및 반환하고 OpenAPI JSON에 반영할 수 있도록 처리할 방법이 있습니까?

나는 모델을 쓰기 위해 pydantic을 사용하고 있다.




네, 가능합니다. 경로 장식기의 매개 변수에서 Union을 사용할 수 있습니다(아래의 새로운 python 3.10 스타일을 사용했습니다). 여기 완전한 예가 있습니다. 이것은 그대로 작동할 것입니다.

from typing import Union

from fastapi import FastAPI, Query
from pydantic import BaseModel

class responseA(BaseModel):
    name: str

class responseB(BaseModel):
    id: int

app = FastAPI()

@app.get("/", response_model=Union[responseA,responseB])
def base(q: int|str = Query(None)):
    if q and isinstance(q, str):
        return responseA(name=q)
    if q and isinstance(q, int):
        return responseB(id=q)
    raise HTTPException(status_code=400, detail="No q param provided")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000,  )

편집: 아래 주석에서 Tomásh Linhart가 지적한 것처럼 매개 변수는 다음을 사용해야 합니다. 원래 답변에서는 문서에 설명된 대로 모든 사람에게 적용되지 않는 3.10 스타일을 사용했습니다. 문서화 결과:




반응 예제가 여러 개 필요한 경우 다음을 시도할 수 있습니다:

@router.get(
    '/{UserId}',
    summary='get user',
    responses={
        200: {
            "description": "",
            "content": {
                "application/json": {
                    "examples": {
                        "Corporate user": {
                            'value': {
                                'foo': 'bar',
                            },
                        },
                        "Standard user": {
                            'value': {
                                'doo': 'www',
                            },
                        },
                    }
                }
            }
        }
    }
)

enter image description here


반응형