您的位置:

解决方案:fastapi RequestValidationError([ErrorWrapper(e, ("body", e.pos))], body=e.doc) from e

  发布时间:2023-01-30 10:30:01
报错的原因FastAPI会在请求的请求体不符合预期格式时引发这意味着在请求中,请求体的格式与FastAPI中定义的格式不匹配。另外,在实际项目中,还可以使用第三方库如marshmallow来验证请求体,或者在FastAPI中使用自定义验证函数来验证请求体。总之,在使用FastAPI时应该根据实际需要,选择合适的方式来验证请求体,避免这个错误的产生。

报错的原因

FastAPI会在请求的请求体(request body)不符合预期格式时引发"RequestValidationError([ErrorWrapper(e, ("body", e.pos))], body=e.doc)"。这意味着在请求中,请求体的格式与FastAPI中定义的格式不匹配。

这个错误可能是由于请求中请求体格式不正确导致的,例如请求体中缺少了必须的字段或者数据类型不正确。

例如:


from fastapi import FastAPI, Body

app = FastAPI()

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: dict = Body(...)):
    return {"item_id": item_id, "item": item}

如果请求中的请求体不包含"name"字段或者"price"字段,那么会引发这个错误。

解决这个问题的方法是确保请求中请求体的格式与FastAPI定义的格式匹配。

例如:


{
    "name":"item name",
    "price":10
}

这样就能避免这种错误的产生。

如何解决

解决这个问题的方法是确保请求中请求体的格式与FastAPI定义的格式匹配。

例如在定义接口时,使用Pydantic模型来验证请求体,这样能确保请求体中存在必须的字段和数据类型正确,示例如下:


from fastapi import FastAPI, Body
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None

app = FastAPI()

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(..., embed=True)):
    return {"item_id": item_id, "item": item}

这样就能避免 "RequestValidationError([ErrorWrapper(e, ("body", e.pos))], body=e.doc)" 这个错误的产生。

另外,在实际项目中,还可以使用第三方库如marshmallow来验证请求体,或者在FastAPI中使用自定义验证函数来验证请求体。

总之,根据实总之,根据实际需要,选择合适的验证方式,来确保请求体的格式是正确的。

例如,使用自定义验证函数来验证请求体,示例如下:


from fastapi import FastAPI, Body, HttpException

app = FastAPI()

def validate_item(item: dict):
    if "name" not in item:
        raise HTTPException(status_code=400, detail="Item name is required")
    if "price" not in item:
        raise HTTPException(status_code=400, detail="Item price is required")
    if not isinstance(item.get("price"), (int, float)):
        raise HTTPException(status_code=400, detail="Item price should be a number")

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: dict = Body(...,validate=validate_item)):
    return {"item_id": item_id, "item": item}

这样就能在请求体不符合预期的情况下,立即返回错误信息。

总之,在使用FastAPI时应该根据实际需要,选择合适的方式来验证请求体,避免 "RequestValidationError([ErrorWrapper(e, ("body", e.pos))], body=e.doc)" 这个错误的产生。

使用例子

是的,我已经在上面提供了一些例子。例如使用Pydantic模型来验证请求体,示例如下:


from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None

app = FastAPI()

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(...)):
    return {"item_id": item_id, "item": item}

还有使用自定义验证函数来验证请求体,示例如下:


from fastapi import FastAPI, Body, HttpException

app = FastAPI()

def validate_item(item: dict):
    if "name" not in item:
        raise HTTPException(status_code=400, detail="Item name is required")
    if "price" not in item:
        raise HTTPException(status_code=400, detail="Item price is required")
    if not isinstance(item.get("price"), (int, float)):
        raise HTTPException(status_code=400, detail="Item price should be a number")

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: dict = Body(...,validate=validate_item)):
    return {"item_id": item_id, "item": item}

这些都是解决 "RequestValidationError([ErrorWrapper(e, ("body", e.pos))], body=e.doc)" 这个错误的方法。希望这些例子能帮助你理解并解决这个问题。