首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FastApi: 422个不可处理实体

FastApi: 422个不可处理实体
EN

Stack Overflow用户
提问于 2022-01-24 03:37:28
回答 5查看 9.7K关注 0票数 0

当我尝试接受一个迂腐的模型时,我得到了这个错误。在调试了相当一段时间之后,我认为问题在于接受CodeCreate

Pydantic模型

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)

Handler

代码语言:javascript
运行
复制
@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")

来自客户端的请求体

代码语言:javascript
运行
复制
{
  "code": {
    "index": 0,
    "email": "user@example.com",
    "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响应体

代码语言:javascript
运行
复制
{
  "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模型和Code ORM模型之间可能有冲突,但我不知道如何解决。

代码语言:javascript
运行
复制
class Config:
    orm_mode = True
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-01-25 07:51:37

在调试了很长一段时间后找到了解决方案。

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

在我的例子中,我不得不创建另一个类,它扩展了CodeCreate类,将ORM配置添加到该类中,并从客户端使用CodeCreate作为body。

代码语言:javascript
运行
复制
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

邮政请求

代码语言:javascript
运行
复制
@app.post('/verify-code')
async def verify_code(code: schemas.CodeCreate):
    return 'success'
票数 -1
EN

Stack Overflow用户

发布于 2022-10-23 10:20:44

由于422 Unprocessable Entity ContentType造成的错误是不正确的。FastAPI/Pydantic需要ContentType = application/json来解析请求体。

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

如果不加的话!

票数 1
EN

Stack Overflow用户

发布于 2022-01-24 05:22:13

根据MDN 这里422 Unprocessable Entity意味着无法处理请求的信息。

在这种情况下,最可能的问题是发送的POST请求的数据与Pydantic模型不匹配。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70828763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档