代码之家  ›  专栏  ›  技术社区  ›  Houman

如何为HTTP 400错误定义单独的响应模型?

  •  0
  • Houman  · 技术社区  · 3 年前

    我被迫将响应模型中的所有值都设置为可选值。

    class ConnectOut(BaseModel):
        product_id: Optional[str]
        expires_at: Optional[datetime]
        detail: Optional[ErrorType]
    

    @router_connect.post("/", status_code=200, response_model=ConnectOut)
    async def connect(
        body: ConnectIn,
        response: Response,
    ):
        if account.is_banned:
            response.status_code = status.HTTP_400_BAD_REQUEST
            return {"detail": ErrorType.USER_IS_BANNED}
    

    有没有办法定义成功的响应模型和400条错误消息的响应模型?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Jason Rebelo Neves    3 年前

    你可以简单地 raise HTTPException 而不是针对给定的响应模型返回不合适的响应,例如:

    from fastapi import HTTPException
    ...
    raise HTTPException(status_code=400, detail="Example bad request.")
    

    编辑:

    出于文档的目的,您可以执行以下操作以使其正确显示:

    @example_router.post(
        "/example",
        response_model=schemas.Example,
        status_code=201,
        responses={200: {"model": schemas.Example}, 400: {"model": schemas.HTTPError}},
    )
    def create_example(...) -> models.Example:
        ...
        raise HTTPException(status_code=400, detail="Example bad request.")
    

    HTTPError 架构如下所示:

    from pydantic import BaseModel
    
    class HTTPError(BaseModel):
        """
        HTTP error schema to be used when an `HTTPException` is thrown.
        """
    
        detail: str
    
    推荐文章