当我尝试接受一个迂腐的模型时,我得到了这个错误。在调试了相当一段时间之后,我认为问题在于接受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)
Handler
@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": "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响应体
{
"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模型之间可能有冲突,但我不知道如何解决。
class Config:
orm_mode = True
发布于 2022-01-25 07:51:37
在调试了很长一段时间后找到了解决方案。
ORM
配置的迂回模型不能用于接收来自客户端的请求。
在我的例子中,我不得不创建另一个类,它扩展了CodeCreate
类,将ORM
配置添加到该类中,并从客户端使用CodeCreate
作为body。
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'
发布于 2022-10-23 10:20:44
由于422 Unprocessable Entity
ContentType造成的错误是不正确的。FastAPI/Pydantic需要ContentType = application/json
来解析请求体。
您确定您的POST请求的application/json头是 ContentType头吗?
如果不加的话!
发布于 2022-01-24 05:22:13
https://stackoverflow.com/questions/70828763
复制相似问题