FastApi:422无法处理的实体[重复]

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

我在尝试接受迂腐模型时遇到此错误。经过一段时间的调试后,我相信问题出在接受

CodeCreate

Pydantic 模型

class BaseCode(BaseModel):
    index: Optional[int] = Field(None)
    email: EmailStr
    gen_time: datetime
    expire_time: datetime


class CodeCreate(BaseCode):
    code: int
    used_time: Optional[datetime] = Field(None)

    class Config:
        orm_mode = True

class Message(BaseModel):
    message: str

代码ORM

class Code(Base):
    __tablename__ = 'code'

    index = Column(Integer, primary_key=True, autoincrement=True)
    code = Column(Integer)
    email = Column(String, ForeignKey('user.email'))
    gen_time = Column(DateTime)
    expire_time = Column(DateTime)
    used_time = Column(DateTime, nullable=True)

处理程序

@app.post('/verify-code', response_model=schemas.Message, responses={404: {"model": schemas.Message}, 406: {"model": schemas.Message}})
async def verify_code(code: schemas.CodeCreate, response: Response, device_name: str = Body(..., embed=True), db=Depends(get_db)):

    result = crud.verify_and_insert_code(db=db, code=code)
    if result == 'matched':
        response.status_code = status.HTTP_202_ACCEPTED
        return crud.start_new_session(db=db, session=schemas.Session(session_id='1234', start_time=datetime.now(), email=code.email, device_name=device_name))
    elif result == 'not-matched':
        response.status_code = status.HTTP_200_OK
    elif result == 'expire':
        response.status_code = status.HTTP_406_NOT_ACCEPTABLE
    elif result == 'invalid':
        response.status_code = status.HTTP_404_NOT_FOUND

    return schemas.Message(message="Item not found")

客户的请求正文

{
  "code": {
    "index": 0,
    "email": "[email protected]",
    "gen_time": "2022-01-24T16:38:12.612Z",
    "expire_time": "2022-01-24T16:38:12.612Z",
    "code": 0,
    "used_time": "2022-01-24T16:38:12.612Z"
  },
  "device_name": "string"
}

422 的响应正文

{
  "detail": [
    {
      "loc": [
        "body",
        "code",
        "email"
      ],
      "msg": "field required",
      "type": "value_error.missing"
    },
    {
      "loc": [
        "body",
        "code",
        "gen_time"
      ],
      "msg": "field required",
      "type": "value_error.missing"
    },
    {
      "loc": [
        "body",
        "code",
        "expire_time"
      ],
      "msg": "field required",
      "type": "value_error.missing"
    },
    {
      "loc": [
        "body",
        "code",
        "code"
      ],
      "msg": "field required",
      "type": "value_error.missing"
    }
  ]
}

临时解决方案

从 Pydantic 模型中删除此 ORM 确认代码可以解决该问题。我相信

CodeCreate
pydantic 模型和
Code
ORM 模型之间可能存在冲突,但我不知道如何解决它。

class Config:
    orm_mode = True
python fastapi pydantic http-status-code-422
4个回答
6
投票

由于

ContentType
不正确而导致 422 Unprocessable Entity 错误。 FastAPI/Pydantic 需要
ContentType = application/json
来解析请求正文。

您确定您的 POST 请求的 ContentType 标头是 application/json

如果没有添加!


0
投票

根据MDN 这里, a

422 Unprocessable Entity
表示请求的信息无法处理。

在这种情况下,最有可能的问题是发送的

POST
请求的数据与Pydantic模型不匹配。

确保发送的数据格式正确。


0
投票

正如 Brian Law 上面所说,您的请求正文采用

Code
的形式,这不是 pydantic 模型,而是数据库模型。

当您发送

POST
请求时,正文应与
CodeCreate
匹配,而不是
Code


0
投票

调试了一段时间找到了解决方案。

ORM
配置的迂腐模型不能用于接收来自客户端的请求。

就我而言,我必须创建另一个类来扩展

CodeCreate
类,向该类添加
ORM
配置,并使用
CodeCreate
作为客户端的主体。

class BaseCode(BaseModel):
    index: Optional[int] = Field(None)
    email: EmailStr
    gen_time: datetime
    expire_time: datetime


class CodeCreate(BaseCode):
    code: int
    used_time: Optional[datetime] = Field(None)

    
class Code(CodeCreate):

    class Config:
            orm_mode = True

发布请求

@app.post('/verify-code')
async def verify_code(code: schemas.CodeCreate):
    return 'success'
© www.soinside.com 2019 - 2024. All rights reserved.