FastAPI Swagger 文档显示不正确的响应状态?

问题描述 投票:0回答:1

通过 FastAPI 实现的路由(下面的代码片段)工作正常。

@app.post(path='/user/create/')
async def create_user(response: Response,
                      email: str = Form(),
                      password: str = Form()) -> None:
    """
    Create a new user with this route.
    Possible responses:
    201: New User Created
    400: Bad email id supplied.
    409: User already signed up, hence causing conflict with existing id.
    """
    logging.info(msg=f'New user sign up request from {email}.')
    try:
        user: WebUser = WebUser(email=email, password=password)
        # Either 409 or 201
        response.status_code = [CONFLICT, CREATED][await user.create_new()]
    except ValidationError:
        logging.error(
            msg=f'User creation for {email} failed because of bad request.')
        response.status_code = BAD_REQUEST  # 400

但是 FastAPI swagger 文档显示了错误的(实际上完全随机的)响应。这是截图。

因此,它没有显示 409 和 400,而是以某种方式显示 422 作为可能的响应。另外,成功的响应实际上是 201。

那么 FastAPI 是如何在幕后形成这些文档的?我是否做错了什么来误导它?或者是 FastAPI 中的一个错误?

python fastapi httpresponse asgi
1个回答
0
投票

这记录在文档的其他状态代码OpenAPI 中的其他响应部分。

如果我们像这样重写你的代码:

import random
import logging
import pydantic
from fastapi import FastAPI, Response, Form
from fastapi.responses import JSONResponse

app = FastAPI()


class BaseModel(pydantic.BaseModel):
    pass


class Message(BaseModel):
    message: str


class WebUser(BaseModel):
    email: str
    password: str


def user_create_new(user: WebUser):
    if random.randint(0, 100) > 50:
        pass
    else:
        raise ValueError()


@app.post(
    path="/user/create",
    responses={400: {"model": Message}, 409: {"model": Message}},
)
async def create_user(
    response: Response, email: str = Form(), password: str = Form()
) -> None:
    logging.info(msg=f"New user sign up request from {email}.")
    user: WebUser = WebUser(email=email, password=password)
    try:
        user_create_new(user)
        return Message(message=f"Created user {email}")
    except ValueError:
        return JSONResponse(
            status_code=400, content=Message(message="Unable to create user").dict()
        )

然后 http://localhost/openapi 获取我们:

© www.soinside.com 2019 - 2024. All rights reserved.