FastAPI — Как использовать HttpException в ответах?

#python #fastapi #starlette

#python #fastapi #старлетка

Вопрос:

В документации предлагается создавать HttpException с ошибками клиента, что здорово. Но как я могу показать эти конкретные ошибки в документации, следуя модели HttpException? Имеется в виду dict с ключом «detail».

Следующее не работает, потому что HttpException не является моделью Pydantic.

 @app.get(
    '/test', 
    responses={
        409 : {
            'model' : HTTPException, 
            'description': 'This endpoint always raises an error'
        }
    }
)
def raises_error():
    raise HTTPException(409, detail='Error raised')
  

Комментарии:

1. Разве example это не так? Если нет, можете ли вы показать нам, как это будет выглядеть в документе swagger?

Ответ №1:

Да, это недопустимый тип Pydantic, однако, поскольку вы можете создавать свои собственные модели, для него легко создать модель.

 from fastapi import FastAPI
from fastapi.exceptions import HTTPException
from pydantic import BaseModel


class Dummy(BaseModel):
    name: str


class HTTPError(BaseModel):
    detail: str

    class Config:
        schema_extra = {
            "example": {"detail": "HTTPException raised."},
        }


app = FastAPI()


@app.get(
    "/test",
    responses={
        200: {"model": Dummy},
        409: {
            "model": HTTPError,
            "description": "This endpoint always raises an error",
        },
    },
)
def raises_error():
    raise HTTPException(409, detail="Error raised")
  

Я считаю, что это то, чего вы ожидаете

введите описание изображения здесь

Комментарии:

1. спасибо за это, мне было интересно, почему я не смог отобразить ошибку в документах swagger. Я вижу, вам нужно добавить responses: аргумент.

2. для статуса 200 вы можете использовать response_model . Кроме того, одно замечание: какие бы модели вы ни добавляли в ответы, FastAPI не проверяет их с вашим фактическим ответом для этого кода. Это просто для развязности.