通过 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 中的一个错误?
这记录在文档的其他状态代码和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 获取我们: