如何处理 FastAPI 中的额外数据错误
How to handle extra data error in FastAPI
所以我有以下快速API代码:
from fastapi import FastAPI
app = FastAPI
class Demo(BaseModel):
content: str = None
@app.post("/demo")
async def demoFunc(d:Demo):
return d.content
问题是,当我向 API 发送带有额外数据的请求时,例如:
data = {"content":"some text here"}aaaa
或
data = {"content":"some text here"aaaaaa}
resp = requests.post(url, json=data)
在 [=16= 的情况下,return 字段中的实际(“此处有一些文本”)和额外(“aaaaa”)数据会抛出状态代码 422 unprocessable entity
错误]:
{
"detail": [
{
"loc": [
"body",
47
],
"msg": "Extra data: line 4 column 2 (char 47)",
"type": "value_error.jsondecode",
"ctx": {
"msg": "Extra data",
"doc": "{\n \"content\": \"some text here\"}aaaaa",
"pos": 47,
"lineno": 4,
"colno": 2
}
}
]
}
我试图将行 app=FastAPI
放在 try-catch 块中,但是它不起作用。有什么办法可以用自己的响应而不是上面提到的自动响应来处理这个问题?
像这样:
{"error": {"message": "Invalid JSON body"},
"status": 0}
你到底想达到什么目的?您正在传递一个无效的 JSON,并且服务器使用 422 unprocessable entity error
正确响应。您的测试客户端根本不应该能够 运行,而不会抛出 invalid syntax
错误。所以,我猜你通过 OpenAPI 尝试过并收到相关的 422 错误。
如果你真正想要的是处理错误,为了自定义错误什么的,你可以覆盖请求验证异常,如documentation (also, have a look at this discussion中所述)。下面是一个例子。
from fastapi import FastAPI, Body, Request, status
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import BaseModel
app = FastAPI()
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
content=jsonable_encoder({"detail": exc.errors(),
"body": exc.body,
"custom msg": {"Your error message"}}),
)
class Demo(BaseModel):
content: str = None
@app.post("/demo")
async def demoFunc(d:Demo):
return d.content
或者,您也可以 return PlainTextResponse
任何自定义消息:
from fastapi.responses import PlainTextResponse
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
return PlainTextResponse(str(exc), status_code=400)
所以我有以下快速API代码:
from fastapi import FastAPI
app = FastAPI
class Demo(BaseModel):
content: str = None
@app.post("/demo")
async def demoFunc(d:Demo):
return d.content
问题是,当我向 API 发送带有额外数据的请求时,例如:
data = {"content":"some text here"}aaaa
或
data = {"content":"some text here"aaaaaa}
resp = requests.post(url, json=data)
在 [=16= 的情况下,return 字段中的实际(“此处有一些文本”)和额外(“aaaaa”)数据会抛出状态代码 422 unprocessable entity
错误]:
{
"detail": [
{
"loc": [
"body",
47
],
"msg": "Extra data: line 4 column 2 (char 47)",
"type": "value_error.jsondecode",
"ctx": {
"msg": "Extra data",
"doc": "{\n \"content\": \"some text here\"}aaaaa",
"pos": 47,
"lineno": 4,
"colno": 2
}
}
]
}
我试图将行 app=FastAPI
放在 try-catch 块中,但是它不起作用。有什么办法可以用自己的响应而不是上面提到的自动响应来处理这个问题?
像这样:
{"error": {"message": "Invalid JSON body"},
"status": 0}
你到底想达到什么目的?您正在传递一个无效的 JSON,并且服务器使用 422 unprocessable entity error
正确响应。您的测试客户端根本不应该能够 运行,而不会抛出 invalid syntax
错误。所以,我猜你通过 OpenAPI 尝试过并收到相关的 422 错误。
如果你真正想要的是处理错误,为了自定义错误什么的,你可以覆盖请求验证异常,如documentation (also, have a look at this discussion中所述)。下面是一个例子。
from fastapi import FastAPI, Body, Request, status
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import BaseModel
app = FastAPI()
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
content=jsonable_encoder({"detail": exc.errors(),
"body": exc.body,
"custom msg": {"Your error message"}}),
)
class Demo(BaseModel):
content: str = None
@app.post("/demo")
async def demoFunc(d:Demo):
return d.content
或者,您也可以 return PlainTextResponse
任何自定义消息:
from fastapi.responses import PlainTextResponse
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
return PlainTextResponse(str(exc), status_code=400)